OpenSSH (скорее всего, то, что вы используете) решает, создавать ли оболочку входа в систему или нет, и делает это только в том случае, если вы не запускаете определенную команду. От man ssh
:
If command is specified, it is executed on the remote host instead of a login shell.
Таким образом, для сервера ssh это выбор реализации: хочет ли он создать оболочку входа или нет, и если вы даете команду на запуск, он этого не делает.
Хотя ssh
вход в систему и выполняется, но если вы выполняете команду и выходите из нее, на самом деле это гораздо больше похоже на создание оболочки для простого запуска этой команды, чем на получение среды входа. Кажется, учитывая это, что люди, пишущие OpenSSH, решили относиться к этому как к такой задаче.
Они создают неинтерактивную, не входящую в систему оболочку для выполнения команды, потому что это дух запуска команды в другом контексте / оболочке. Обычно, однако, неинтерактивные оболочки не будут автоматически источником, ~/.bashrc
что явно происходит здесь. bash
на самом деле пытается помочь нам здесь. Из документов
Вызывается демоном удаленной оболочки
Bash пытается определить, когда он запускается со стандартным входом, подключенным к сетевому соединению, как при выполнении демоном удаленной оболочки, обычно rshd, или демоном защищенной оболочки sshd. Если Bash определяет, что он выполняется таким образом, он читает и выполняет команды из ~ / .bashrc, если этот файл существует и доступен для чтения. Он не будет делать это, если вызывается как sh. Параметр --norc можно использовать для запрета этого поведения, а параметр --rcfile можно использовать для принудительного чтения другого файла, но ни rshd, ни sshd обычно не вызывают оболочку с этими параметрами и не позволяют их указывать.