Назад | Перейти на главную страницу

Почему $ PATH удаленной команды ssh отличается от таковой в интерактивной оболочке?

У меня есть пользователь, который не вносил никаких изменений в $ PATH ни в каких точечных файлах: это именно системная настройка по умолчанию. Из оболочки входа:

$ ssh example.com
user@example.com:~$ cat /tmp/hello.hs
#!/bin/bash

echo "$SHELL"
echo "$PATH"

user@example.com:~$ /tmp/hello.hs
/bin/bash
/usr/local/bin:/usr/bin:/bin

Точно так, как указано в /etc/profile. Я нахожу это довольно неожиданным:

$ ssh example.com '/tmp/hello.sh'
/bin/bash       
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games

Как я уже сказал, в $ PATH нет изменений. ~/.bashrc, ни в /etc/bash.bashrc. Нет ~/.ssh/environment либо. В ssh(1) объявляет, что переменная среды PATH является

Установите PATH по умолчанию, как указано при компиляции ssh.

но эта тема из StackOverflow и это список рассылки статья предполагает, что я должен иметь возможность влиять на $ PATH для данной команды, просто изменяя / etc / profile, один из файлов запуска оболочки и т. д.

Что тут происходит?

Из ssh(1) страница руководства: «Если команда указана, она выполняется на удаленном хосте вместо оболочки входа».

Короче говоря, когда вы действительно входите в систему, bash запускается как оболочка входа и загружает соответствующие файлы, когда вы подключаетесь удаленно и вводите команду, она запускается вместо bash, что означает, что эти файлы НЕ загружаются. Вы можете обойти это с помощью su -l -c или аналогичный в командной части ssh.

В некоторых случаях я видел -t аргумент для работы ssh (выделить tty) тоже.

Редактировать 1:
Я думаю, что информация PATH, которую вы нашли, указывает на то, что путь по умолчанию (если мы его не переопределим) скомпилирован в sshd. Я убедился, что в моих / etc / profile, / etc / bash *, локальных файлах точек и т. Д. Не было информации о PATH, затем я вошел в систему и все еще имел PATH. Я искал его в sshd и нашел там. Итак, как говорится на странице руководства:

ahnberg@remote$ strings /usr/sbin/sshd | grep -i x11 | grep bin
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games

Затем я добавляю PATH=$PATH:/my/test на самый верх моего .bashrc файл на удаленном компьютере и проверьте его еще раз:

ahnberg@local$ ssh ahnberg@remote "env | grep PATH"
PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/my/test

Так что я могу абсолютно повлиять на это, и по умолчанию PATH скомпилирован в sshd. :)

Я придумал другое решение проблемы. Лично я предпочитаю создавать новые файлы конфигурации, а не изменять существующие. Таким образом, я могу упростить внесение изменений в конфигурацию по умолчанию.

Вот содержание /etc/profile.d/ssh_login.sh:

#!/bin/sh
if [ "$SSH_CONNECTION" ]; then
    echo "User '$USER' logged in from '${SSH_CONNECTION%% *}'"
    . /etc/environment
fi

С помощью dropbear на месте openssh-server (это также должно работать с openssh), переменная SSH_CONNECTION устанавливается автоматически, когда я вхожу в систему удаленно. Я создал новую конфигурацию профиля оболочки для обнаружения логинов SSH, отображения некоторой информации на экране и, что наиболее важно, загрузки глобальных настроек среды из /etc/environment для замены встроенных значений. Обратите внимание, что это влияет только на интерактивные оболочки SSH, но не на удаленное выполнение команд.

Альтернативно, если вы используете openssh и всегда хотите загрузить глобальную среду, независимо от того, является ли это интерактивной оболочкой, вы можете разместить символическую ссылку в ~/.ssh/ как это:

ln -s /etc/environment ~/.ssh/environment

Затем вам нужно включить PermitUserEnvironment вариант в /etc/sshd/sshd_config. Однако делайте это только для доверенных пользователей, так как это может позволить им обойти ограничения доступа в некоторых конфигурациях с использованием таких механизмов, как LD_PRELOAD. Посмотри пожалуйста man sshd_config для получения дополнительной информации, в частности, как использовать Match блоки для ограничения параметров для определенных пользователей / групп.

Мне удалось заставить ssh запускать команды, используя удаленный путь, запустив:

ssh dist@d6 "bash --login -c 'env'"

Здесь env можно заменить любой командой, которая вам нужна.

У меня есть авторизованные ключи, поэтому мне не нужен пароль для запуска команды или ssh.

Если вы хотите, чтобы путь к профилю загружался, попробуйте:

#!/bin/bash -i

в верхней части сценария. Таким образом, оболочка находится в интерактивном режиме при запуске скрипта.

Когда bash вызывается как интерактивная оболочка входа или как неинтерактивная оболочка с параметром --login, она сначала считывает и выполняет команды из файла / etc / profile, если этот файл существует. После прочтения этого файла он ищет ~ / .bash_profile, ~ / .bash_login и ~ / .profile в указанном порядке, а также читает и выполняет команды из первого, существующего и доступного для чтения. Параметр --noprofile может использоваться при запуске оболочки, чтобы запретить такое поведение.

http://linux.die.net/man/1/bash