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

Пока у Вас нет проблем возможности соединения, да, безопасно удалить их. Действительно будьте осторожны, потому что Windows покажет "Учетную запись, Неизвестную", если это не может соединиться с AD, или если у Вас есть несколько доменов, это могло бы занять некоторое время для пересечения доменных границ и т.д.

20
задан 23 May 2017 в 15:41
4 ответа

Из 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. :)

16
ответ дан 2 December 2019 в 20:11

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

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

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

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

3
ответ дан 2 December 2019 в 20:11

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

#!/bin/bash -i

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

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

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

0
ответ дан 2 December 2019 в 20:11

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

Вот содержимое /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 для ограничения параметров для определенных пользователей / групп.

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

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

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

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

3
ответ дан 2 December 2019 в 20:11

Теги

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