ssh + sudo + su w powłoce logowania

11

Mam kilka maszyn, na których ssh regularnie, tylko w celu sudo suspędzenia reszty sesji zalogowanej jako użytkownik specjalnego przeznaczenia. Ogólny przepływ pracy to:

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

Chciałbym sprowadzić to do jednego linijki, którą mogę alias, więc mogę po prostu ustawić alias dla każdej maszyny i przejść do miejsca, w którym muszę być w jednym poleceniu, bez konieczności wpisywania płyty sudo su - specialuserkotłowej. Mógłbym może skonfigurować me@othermachine, aby sudo suprzy logowaniu, ale chciałbym zachować elastyczność, aby działać jako mejeśli muszę.

( Uwaga: nie mam żadnej kontroli nad othermachinetym, jak jest skonfigurowany; jest to ustalony przepływ pracy, do którego dołączyłem, gdy zostałem zatrudniony).

Moja pierwsza myśl była słuszna

ssh me@othermachine "sudo su - specialuser"

i tego rodzaju działa, ale nie daje mi żadnych wskazówek, ^Czabija go i wylogowuje, i zakładam, że różne inne rzeczy prawdopodobnie również są złe.

Po przeczytaniu polecenia Uruchom zdalną ssh z opcją Full Login Shell wypróbowałem kilka bardziej egzotycznych rzeczy

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

i

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

- z których nie spodziewałem się zadziałać, a nie zadziałały, ale pomyślałem, że powinienem wypróbować je dla kompletności (i aby uniknąć duplikatu); wyprodukowali tę samą powłokę bez monitów (druga z dodatkową premią bez powłoki do uzupełniania mepo exittej z drugiej specialuser). I próbowałem

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

ale to mnie dopadło

sudo: no tty present and no askpass program specified

Lepsze pomysły?

David Moles
źródło
Co powiesz na dodanie polecenia sudo ~/.profilepo krótkim opóźnieniu?
Alex
Chodzi o to, że w dziwnym przypadku nie chcę sudouderzyć ^C? Jeśli nie mogę wymyślić nic lepszego, mógłbym spróbować.
David Moles,
1
Mógłbyś su mez specialuser. Lub w .profilelub .bashrc, jeśli nie będziesz postępować zgodnie sudoz exit, pierwszy exitzabierze Cię z powrotem me, a drugi zakończy sesję. Lub nawet użyj pliku flagi, więc sudojest poprzedzony [ -f ~/.keep.me ] && del ~/.keep.mei następuje po nim [ \! -f ~/.keep.me ] && exit: wtedy potrzebujesz tylko skryptu lub aliasu dla polecenia meas :>~/.keep.me; exit. Teraz exitzakończy sesję i mewróci do sesji logowania.
AFH,
1
Proszę rozważyć napisanie w ostatecznej wersji, /bin/basha nie proste bashze względów bezpieczeństwa (aby uniknąć trojana ). Zwłaszcza jeśli jest coś sudoprzed ...
Hastur

Odpowiedzi:

11

Ta linia powinna działać dla Ciebie

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

To rozwiązanie wyświetla monit lub nie zależy od -tprzełącznika

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

Notatki od man ssh

-t
Wymusza alokację pseudo-tty. Można to wykorzystać do wykonania dowolnych programów ekranowych na zdalnym komputerze, co może być bardzo przydatne, np. Przy wdrażaniu usług menu. Wiele opcji -t wymusza alokację tty, nawet jeśli ssh nie ma lokalnego tty .

Hastur
źródło
Działa to dla mnie ... czy można to zrobić również poprzez ustawienia ~ / .ssh / config dla konkretnego hosta?
hej
1
@ gdzie tak, możesz to zrobić za pomocą RequestTTY force(co jest równe -t) i RemoteCommand sudo su - specialuser! Należy jednak pamiętać, że inne programy korzystające z SSH (takie jak scp, rsync itp.) Nie będą działać poprawnie dla tego hosta.
Robert Riedl