У меня есть несколько важных команд, которые мне нужно выполнить до запуска любой оболочки sh. Это необходимо для передачи команд SSH в команду SSH ( ssh host somecommand
) и других программ, которые запускают команды.
По моему .profile
у меня это:
ihammerhands@wreckcreations:~> cat .profile
#specific environment and startup programs
export PS1="\u@wreckcreations:\w> "
export PYTHONPATH=~/python/lib/python2.4/site-packages
export PATH=$PATH:~/bin:~/python/bin
Тем не менее, это не удается:
W:\programming\wreckcreations-site\test-hg>ssh name@host echo $PATH
Enter passphrase for key '/home/Owner/.ssh/id_rsa':
/usr/local/bin:/bin:/usr/bin
Обратите внимание на отсутствующие опции PATH
Какое собственное имя для профиля sh? Примечание. У меня нет root-доступа, и я не хочу, чтобы это применялось к другим пользователям. Есть ли другой способ сделать это?
РЕДАКТИРОВАТЬ: появляется /bin/sh
ссылки на bash
, что не удивительно. Что удивительно, так это то, что мой профиль все еще игнорируется. Какие-либо предложения?
ssh name@host -t echo $PATH
.Ответы:
Кажется, стоит отметить, что команда, которую вы упоминаете в своем вопросе
почти никогда не будет полезным. Подстановка переменной для $ PATH выполняется вашей локальной оболочкой и передается в ssh, который выполняет echo на удаленной системе, чтобы распечатать содержимое переменной пути, поскольку она развернута в вашей локальной системе. Вот пример того, как я делаю нечто подобное между моим Mac и машиной Linux в моей сети:
Обратите внимание, как мне нужно было использовать кавычки, чтобы моя локальная оболочка не расширяла переменную.
источник
~/.profile
выполняется только логинами. Программа, вызывающая оболочку, решает, будет ли оболочка входить в оболочку входа (путем помещения в-
качестве первого символа нулевого аргумента при вызове оболочки). Обычно он не выполняется при входе в систему для выполнения определенной команды.В частности, OpenSSH вызывает оболочку входа в систему, только если вы не указали команду. Поэтому, если вы укажете команду,
~/.profile
не будут прочитаны.OpenSSH позволяет устанавливать переменные среды на стороне сервера. Это должно быть включено в конфигурации сервера с помощью
PermitUserEnvironment
директивы. Переменные могут быть установлены в файле~/.ssh/environment
. Предполагая, что вы используете аутентификацию с открытым ключом, вы также можете установить переменные для каждого ключа в~/.ssh/authorized_keys
: добавитьenvironment="FOO=bar"
в начале соответствующей строки.Ssh также поддерживает отправку переменных среды. В OpenSSH используйте
SendEnv
директиву in~/.ssh/config
. Однако конкретная переменная среды должна быть включена с помощьюAcceptEnv
директивы в конфигурации сервера, так что это может не сработать для вас.Одна вещь, которая, я думаю, всегда работает (как ни странно), если вы используете аутентификацию с открытым ключом, - это (ab) использовать
command=
опцию вauthorized_keys
файле . Ключ сcommand
опцией подходит только для запуска указанной команды; но команда вauthorized_keys
файле выполняется с переменной среды,SSH_ORIGINAL_COMMAND
установленной для команды, указанной пользователем. Эта переменная пуста, если пользователь не указал команду и поэтому ожидал интерактивную оболочку. Таким образом, вы можете использовать что-то вроде этого~/.ssh/authorized_keys
(конечно, это не будет применяться, если вы не используете этот ключ для аутентификации):Другой возможностью является написание сценариев-обёрток на сервере. Что-то вроде следующего в
~/bin/ssh-wrapper
:Затем сделайте символические ссылки на этот сценарий под названием
rsync
,unison
и т.д. Pass--rsync-path='bin/rsync'
наrsync
командной строке, и так далее для других программ. В качестве альтернативы, некоторые команды позволяют указать удаленный запуск всего фрагмента оболочки, что позволяет сделать команду автономной: например, с rsync вы можете использовать--rsync-path='. ~/.profile; rsync'
.Есть еще один путь, который зависит от того, какая оболочка для входа в систему - bash или zsh. Bash всегда читает,
~/.bashrc
когда он вызывается с помощью rshd или sshd, даже если он не интерактивный (но не если он вызывается какsh
). Зш всегда читает~/.zshenv
.источник
command=
вauthorized_keys
) работает прозрачно. Другие требуют определенной оболочки или параметров в конфигурации сервера ssh. Ртутный эквивалент--rsync-path
есть--remotecmd
.command=
команду, что и в вашем посте superuser.com/a/207262/137762Обычно при входе в систему bash читает команды из:
~ / .bash_profile
~ / .bashrc
Со страницы руководства bash:
источник
У меня заканчивается время, чтобы проверить это, но я смотрю справочные страницы, которые нашел:
man bash: когда bash запускается неинтерактивно, например, для запуска сценария оболочки он ищет переменную BASH_ENV в среде, расширяет ее значение, если оно там появляется, и использует расширенное значение в качестве имени файла для читать и выполнять. Bash ведет себя так, как будто была выполнена следующая команда: if [-n "$ BASH_ENV"]; затем . "$ BASH_ENV"; но значение переменной PATH не используется для поиска имени файла.
man ssh: ~ / .ssh / environment Содержит дополнительные определения переменных среды; см. ОКРУЖАЮЩАЯ СРЕДА, выше.
Комбинация подсказывает, как вы можете заставить ssh выполнить ваш .profile
К сожалению, мой сервер имеет PermitUserEnvironment со значением по умолчанию, равным no, что означает, что это не работает для меня (и, как я уже сказал, у меня больше нет времени, чтобы играть с ним).
источник
(удалено ... может иметь только одну гиперссылку в качестве нового пользователя ~)
Обновить
Извините, я не видел, чтобы речь шла о неинтерактивном сеансе, к которому вышеуказанная ссылка не относится.
Итак, вопрос в том, почему он не запускается, даже если ваша оболочка запускается так.
Источник
источник