Как использовать нестандартную оболочку для входа в систему по ssh

9

В настоящее время я работаю в сети, которая использует LDAP для аутентификации. Установив в zshкачестве оболочки для входа в систему, я столкнулся с проблемой получения удаленного доступа sshк одной из машин в сети, которая, по-видимому, не была zshустановлена. Сбой входа с

Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist

Таким образом, вопрос в основном таков: как я могу сказать удаленной машине использовать другую оболочку входа в систему, отличную от той, которая была настроена в LDAP?

OpenSSH_6.0p1 Debian-4 + deb7u2, OpenSSL 1.0.1e

Sascha
источник
Рассматривали ли вы вопрос об изменении вашей оболочки LDAP на что-то более универсальное, например, а /bin/shзатем сделали ли ваш удаленный ~/.profileисполняющий модуль подходящей оболочкой, если она доступна?
RobertL
Это был бы вариант, но не очень чистый, так что я бы предпочел его избежать, если это возможно.
Саша
связанных stackoverflow.com/questions/24993598/ssh-then-change-shell
Trevor Boyd Smith

Ответы:

11

Если ваша оболочка для входа не может быть запущена на каком-либо компьютере, вы не можете войти в нее через SSH или большинством других методов в этом отношении. Сервер SSH всегда выполняет вашу оболочку входа в систему. Если вы передадите команду в sshкомандной строке, то оболочка входа будет выполнена с -cкомандной строкой¹ в качестве аргументов; в противном случае оболочка входа выполняется как оболочка входа без аргумента.

Если бы был способ обойти оболочку входа, это было бы дырой в безопасности. Учетная запись может быть настроена как ограниченная учетная запись, превратив ее оболочку входа в систему в программу, которая выполняет только одну конкретную задачу; например, оболочка входа в систему может git-shellразрешить доступ только к git-репозиторию, или rsshи т. д.

Чтобы войти на этот компьютер, вам нужно либо организовать /bin/zshприсутствие, либо изменить оболочку входа на что-то, что присутствует.

В такой неоднородной среде я рекомендую придерживаться в /bin/shкачестве оболочки для входа, поскольку она присутствует везде. Задайте для SHELLпеременной среды значение, /bin/zshесли оно присутствует, и вы получите zsh в качестве интерактивной оболочки.

if [ -x /bin/zsh ]; then
  export SHELL=/bin/zsh
fi

Пока вы это делаете, это позволяет избежать жесткого кодирования пути к zsh.

if SHELL=$(command -v zsh); then
  export SHELL
else
  unset SHELL
fi

Чтобы заставить zsh автоматически запускаться для входа в текстовом режиме, вызовите его из своего .profile. Если вы хотите использовать его .zprofileдля настройки, сделайте это оболочкой для входа (но тогда вы не получите ту же среду на машинах, где нет zsh, поэтому я не рекомендую этого). Делайте это только в том случае, если это интерактивный вход в систему, а не при .profileвыполнении сценарием, во время входа в режиме графического интерфейса и т. Д.

if case $- in *i*) true;; *) false;; esac &&  # interactive shell
   [ -z "$ZSH_VERSION" ] &&                   # not running zsh yet
   type zsh >/dev/null 2>/dev/null; then      # zsh is present
  exec zsh
fi

¹ Клиент SSH присоединяет его без опции аргументы с пробелами между ними, и отправляет полученную строку через соединение. Протоколы SSH определяют команду как строку, а не список строк.

Жиль "ТАК - перестань быть злым"
источник
Спасибо за подробное объяснение. Похоже, что это единственный путь, который не требует установки zsh на удаленной машине, и он работает отлично, поэтому я буду придерживаться его.
Саша
Я также предлагаю добавить тест [ "0$SHLVL" -lt 2 ]в случае, если оболочка входа в систему по умолчанию поддерживает, $SHLVLчтобы bash -lпри необходимости можно было запустить другую оболочку (например, в случае сбоя zsh по какой-либо причине). Таким образом ssh -t host bash -l, запускается bashоболочка входа в систему без выполнения zsh. Кроме того , я хотел бы заменить exec zshна exec zsh -lтак , что .zloginфайл используется.
vinc17
2

Вы должны установить оболочку на указанном компьютере, если у вас есть доступ другим способом, или попросить администратора сделать это за вас, или заменить вашу оболочку в ldap на оболочку, существующую на удаленной машине.

(open) sshd всегда будет проверять пользовательскую оболочку и всегда будет выполнять эту оболочку независимо от того, что передано для выполнения. Если для выполнения передается другая оболочка, она выполняет ее, передавая ее в качестве аргумента пользовательской оболочке, например, пользовательская оболочка - '/ bin / sh', и вы передаете в качестве аргумента оболочку csh, чем она будет выполняться "/ bin / sh -c / bin / csh '.

nkms
источник
Прочитайте redfast комментарий. openssh позволяет вам обойти оболочку по умолчанию.
Руи Ф Рибейро
@Rui F Ribeiro Если это так, то это устраняет логику установки оболочки на что-то вроде '/ bin / false' или '/ sbin / nologin'. Если вы имеете в виду изменение оболочки после входа в систему, тогда все в порядке, но она делает это так, как я написал выше (sh -c othersh), если нет '/ bin / sh', то вам не повезло. (Проверено на Redhat).
nkms
Действительно, если у passwd есть оболочка, которой нет в / etc / shells, вы все равно не войдете в систему. Но если вы можете войти в систему, и если sshd_config не заставит вас перейти к определенной оболочке, любая команда, которую пользователь способен запустить, будет честной игрой. Например, если вы выполните еще пару тестов, ssh -l user server "ps ax" | grep bashлегко заметить, что оболочка по умолчанию вызывается не всегда . Что действительно мешает другому решению, так это проверка безопасности zsh, который не находится в / etc / shells
Rui F Ribeiro
@Rui F Ribeiro Запустите strace -f sshd на стороне сервера. Вы увидите что-то вроде "execve (" / bin / bash ", [" bash "," -c "," ps "] ...") Кроме того, / sbin / nologin является допустимой оболочкой в ​​/ etc / shells.
Нкм
Ответ @RuiFRibeiro redfast00 совершенно неверный. НКМ это правильно.
Жиль "ТАК - перестань быть злым"