#linux #ssh
Вопрос:
Я хочу написать сценарий, который выполняет несколько команд на удаленном сервере, включая выполнение некоторых приложений. .bashrc
Файл на удаленной машине определяет PATH
переменную таким образом, чтобы эти приложения находились под ней.
Но когда я попытался использовать ssh <host> <command>
, кажется, что .bashrc
не был загружен. ssh <host> 'echo $PATH'
покажите только несколько таких путей /usr/bin
.
Что смутило меня еще больше, так это то, что даже ssh <host> "source ~/.bashrc; <command>"
не сработало. ssh <host> 'source ~/.bashrc; echo $PATH'
все еще напечатано всего несколько патхов. Я проверил ssh <host> 'cat ~/.bashrc'
и подтвердил, что этот файл действительно содержит все PATH
определения, которые не были затронуты в среде, в которой выполнялась команда.
Комментарии:
1. Запуск NB
ssh <host> "echo $PATH"
отразит ваш путь в локальной системе, а не в удаленной системе.
Ответ №1:
Итак, после двух часов устранения неполадок я, наконец, нахожу проблему. Это происходит потому, что следующая команда в начале .bashrc
.
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Это предотвращает выполнение чего — либо после этого в среде ssh <host> <command>
.
Если у вас возникла аналогичная проблема, попробуйте проверить начало .bashrc
файла.
Комментарии:
1. Это одна из причин, по которой не следует устанавливать переменные среды
.bashrc
. Поместите их в свою конфигурацию оболочки входа, и пусть любые другие интерактивные оболочки, не входящие в систему, наследуют переменные.2. Вот что я сейчас делаю.