ssh игнорирует переменные в файлах профиля

Извинения за этот неопределенный вопрос заранее, но я не знаю, как сузить это.

Я нахожусь на 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'.

1
задан 22 March 2018 в 01:23

1 ответ

Чтения 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, и т.д.

1
ответ дан 7 December 2019 в 15:22

Другие вопросы по тегам:

Похожие вопросы: