Какой хороший способ для пользователя без полномочий root использовать исполняемый файл, которого нет в системном списке оболочек, как если бы он был настоящей оболочкой пользователя?

Я пытаюсь сделать это с двумя разными версиями Bash. Старая версия - это настоящая оболочка. Он отображается в chsh -l , находится в обычном каталоге /bin/bash , и система считает мою оболочку. Я хочу, чтобы более новая версия маскировалась под мою оболочку. У меня это скомпилировано в каталоге. Прямо сейчас у меня есть это в моем .bashrc .

if [ $(echo $0) != $PATH_TO_NEW_SHELL_EXECUTABLE ]; then
    export SHELL=$PATH_TO_NEW_SHELL_EXECUTABLE
    exec "$SHELL" "$@"
fi

Проблема, с которой я столкнулся, заключается в том, что команды, запускаемые через ssh на этом компьютере, висят в строке exec . rsync и scp также зависают. Например, будет зависать следующее.

ssh user@host false

Я не понимаю это поведение. В противном случае это работает. Я даже могу начать интерактивную сессию SSH просто отлично.

Как я могу решить эту конкретную проблему и в целом, как лучше всего симулировать правильно установленную оболочку?

2 ответа2

0

Когда я пытаюсь заменить оболочку входа в систему (другой / новой оболочкой) на exec, я теряю tty:

10869  1118 root        0.0  0.0  \_ sshd: username [priv] 
10907 10869 username    0.0  0.0  |   \_ sshd: username@notty  
10908 10907 username    0.0  0.0  |       \_ /bin/bash

это может быть проблемой.

0

Это не зависало. Ваша команда не была запущена, но ваша новая оболочка находится здесь, в интерактивном режиме и без запроса

test@myhost:~$ ssh localhost false
test@localhost's password: 
echo $0
/home/test/bin/myshell
echo $#
0

Теперь, если в .bashrc перед exec вы добавите следующие строки:

echo $# "$0" "$@"
sleep 300

Вы можете увидеть, что происходит:

test@myhost:~$ ssh localhost false uselessparm1 uselessparm2
0 bash

Рядом:

|-sshd(25350)---sshd(18920)---sshd(18925)---bash(18926)---sleep(18927)

$ cat /proc/18926/cmdline |tr '\0' '\n'
bash
-c
false uselessparm1 uselessparm2

sshd фактически запустит bash -c 'false uselessparm1 uselessparm2'

Но по какой-то причине в этом контексте аргументы командной строки существуют, но $ 1 $ 2 ... не установлены в оболочке ($ # = 0). Таким образом, exec никогда не будет запускать ничего, кроме новой оболочки

Вы должны поместить свой трюк в ~/.bash_profile (выполняется при входе в систему) и оставить ~/.bashrc в покое.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .