ssh + sudo + su в оболочку входа

11

У меня есть несколько машин, которые я регулярно использую sudo suв ssh, только для того, чтобы использовать оставшуюся часть моего сеанса в системе как пользователь специального назначения. Общий рабочий процесс:

mymachine:~ me$ ssh me@othermachine
othermachine:~ me$ sudo su - specialuser # note: no password needed
othermachine:~ specialuser$ # do stuff

Я хотел бы свести это в одну строку, которую я могу назвать псевдонимом, так что я могу просто настроить псевдоним для каждой машины и добраться до места, где я должен быть в одной команде, без необходимости набирать sudo su - specialuserшаблон. Я мог бы , возможно , установить me@othermachineна sudo suвходе в систему, но я хотел бы сохранить гибкость , чтобы работать , как meесли мне нужно.

( Примечание: у меня нет никакого контроля othermachineили способа его настройки; это установленный рабочий процесс, который я использовал при приеме на работу.)

Моя первая мысль была просто

ssh me@othermachine "sudo su - specialuser"

и такого рода работы, но это не дает мне подсказки, ^Cубивает это и выдает меня из системы, и я предполагаю, что другие вещи, вероятно, тоже не правы.

После прочтения команды Run Remote ssh с Full Login Shell я попробовал пару более экзотических вещей, таких как

ssh me@othermachine 'bash -l -c "sudo su - specialuser"'

а также

ssh me@othermachine 'bash -l -c "sudo su - specialuser"; bash'

- ни один из которых я ожидал работать, и они не работали, но я подумал, что я должен попробовать их для полноты (и чтобы избежать дубликата); они создали ту же оболочку без подсказок (вторая с добавленной бонусной оболочкой без подсказок для- meпосле exitот-за specialuser). И я попробовал

ssh me@othermachine "sudo su - specialuser -c bash -l"

но это только у меня

sudo: no tty present and no askpass program specified

Лучшие идеи?

Дэвид Моулз
источник
Как насчет добавления команды sudo ~/.profileпосле небольшой задержки?
Алекс
Идея в том, что в нечетном случае я не хочу, чтобы sudoя ударил ^C? Если я не могу придумать что-то лучшее, я мог бы попробовать это.
Дэвид Моулз
1
Вы могли бы su meот specialuser. Или в .profileили .bashrc, если вы не последуете sudoс exit, ваш первый exitвернет вас назад me, а второй завершит сеанс. Или даже используйте файл флага, поэтому sudoперед ним стоит [ -f ~/.keep.me ] && del ~/.keep.meи следует [ \! -f ~/.keep.me ] && exit: вам нужен только сценарий или псевдоним для команды meas :>~/.keep.me; exit. Теперь exitзавершит сеанс и meвернется к сеансу входа.
AFH
1
Пожалуйста, рассмотрите возможность записи в окончательной версии, /bin/bashа не bashпо соображениям безопасности (чтобы избежать трояна ). Особенно, если есть sudoдо ...
Хастур

Ответы:

11

Эта линия должна работать для вас

ssh -t me@machine "sudo su - specialuser" 

Это решение дает мне подсказку или нет в зависимости от -tпереключателя

ssh -t me@machine "/bin/bash -l"   # Give me a prompt

ssh  me@machine "/bin/bash -l"     # Give me NO prompt
ssh  me@machine                    # Give me NO prompt

Примечания от man ssh

-T
Force псевдо-tty выделения. Это может быть использовано для выполнения произвольных программ на экране на удаленной машине, что может быть очень полезно, например, при реализации сервисов меню. Несколько опций -t заставляют tty выделяться, даже если ssh не имеет локального tty .

Hastur
источник
Это работает для меня ... это можно сделать через настройку ~ / .ssh / config для конкретного хоста?
Эй ,
1
@ где, да, вы можете сделать это с RequestTTY force(что равно -t) и RemoteCommand sudo su - specialuser! Однако следует помнить, что другие программы, использующие SSH (например, scp, rsync и т. Д.), Больше не будут работать должным образом для этого хоста.
Роберт Ридл