Извинения за этот неопределенный вопрос заранее, но я не знаю, как сузить это.
Я нахожусь на Ubuntu 14.04.5 LTS, с помощью OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.10, OpenSSL 1.0.1f 6 Jan 2014
как мой ssh клиент. Я настроил ssh без пароля согласно этим инструкциям: https://help.ubuntu.com/lts/serverguide/openssh-server.html.
Теперь, ssh работает как ожидалось, кроме всех переменных, в которых я определяю .bashrc
или .profile
проигнорированы (да, я знаю это .profile
источники .bashrc
). Все сообщения, связанные с этой проблемой, которую я мог найти на askubuntu.com или stackexchange и т.п., не решили эту проблему.
Локальные переменные существуют и на локальном и на удаленной машине, но когда я ssh
в удаленную машину они не там, что означает, что они отсутствуют в выводе 'ssh ab.cd.efg.hij ENV'; аналогично, ssh ab.cd.efg.hij 'echo $LOCAL_VARIABLE'
не дает вывода.
Какова могла быть причина этого поведения?
Править
Я не имел .bash_profile
или .bash_login
на удаленной машине, как спрошено steeldriver. Я добавил export LOCAL_VARIABLE=foo
одному и затем другому, но это все еще отсутствует в 'ssh ab.cd.efg.hij ENV' и ssh ab.cd.efg.hij 'echo $LOCAL_VARIABLE'
.
Чтения Bash .profile
*, когда выполнено как интерактивная оболочка входа в систему. Когда команда дана для выполнения, или при запущении скрипта, это является неинтерактивным, если Вы не даете -i
опция и невход в систему, если Вы не даете -l
опция, и т.д. Ни одно из этого не обычно возможно при выполнении команд через SSH.
Bash действительно читает .bashrc
когда выполнено нев интерактивном режиме SSH. Однако значение по умолчанию .bashrc
включает проверку на интерактивное использование:
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Так эффективно никакая переменная не началась .profile
или .bashrc
доступно, когда Вы делаете ssh foo some-command
. Можно вставить переменные .bashrc
перед проверкой на интерактивное выполнение. Например:
$ head ~/.bashrc
echo foo
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
$ ssh localhost env
foo
LC_MEASUREMENT=en_GB.UTF-8
SSH_CONNECTION=127.0.0.1 46916 127.0.0.1 22
LC_PAPER=en_GB.UTF-8
LC_MONETARY=en_GB.UTF-8
LANG=en_GB.UTF-8
LC_NAME=en_GB.UTF-8
XDG_SESSION_ID=155
USER=muru
...
echo foo
выполнялся. Если я имел export foo=bar
, затем foo
имел бы обнаружился в env
вывод.
* с подходящими протестами о присутствии файлов как .bash_profile
, и т.д.