Zmuś SSH do użycia określonej powłoki

29

Czy jest jakiś sposób, aby zmusić SSH do użycia określonej powłoki na odległym końcu, niezależnie od domyślnej powłoki użytkownika?

Próbowałem rozwiązań podobnych do:

ssh host.domain.com /bin/bash -c 'complicated, multi-line command'

ale niestety domyślna powłoka na zdalnym końcu jest odpowiedzialna za parsowanie części „skomplikowanej, wieloliniowej komendy” i mam trudności z ucieczką wystarczająco, by działać zarówno dla użytkowników powłoki Bash, jak i C.

Plinehan
źródło

Odpowiedzi:

8

Nie sądzę, aby było to możliwe, przynajmniej w przypadku systemów opartych na openssh. Jeśli masz taką możliwość, lepszym rozwiązaniem może być sftp w górę pliku skryptu powłoki, a następnie wykonanie go za pomocą opublikowanej metody. Miałoby to tę zaletę, że minimalizowało liczbę potrzebnych znaków ucieczki, ale pozostawiałoby plik, który musiałby zostać usunięty (być może jako ostatni krok skryptu).

sysadmin1138
źródło
1
To w końcu zrobiłem, ale używając scp. Świetny pomysł.
plinehan
16

Użyj heredoc:

ssh host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF
Ignacio Vazquez-Abrams
źródło
nie powinieneś używać „-s” dla basha, aby czytać polecenia ze standardowego wejścia?
Weboide,
Nie zawsze jest to wymagane.
Ignacio Vazquez-Abrams
Głosowałbym za tym, gdybym mógł, ponieważ uniemożliwia to komendom dostęp do standardowego wejścia, a pytanie dotyczyło wywołania określonej powłoki.
Eric Woodruff,
3
@EricWoodruff, ... wywoływanie konkretnej powłoki (w tym przypadku bash) jest dokładnie tym , co pokazuje, jak to zrobić.
Charles Duffy
1
Do Twojej wiadomości możesz to zrobić cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash. Zamiast jednego kroku masz dwa kroki: krok 1 skopiuj skrypt do pliku, krok 2 catskrypt do ssh.
Trevor Boyd Smith
10

Używaj logowań opartych na kluczach, a nie na hasłach. Następnie możesz dodać (listę) „poleceń wymuszonych” do swojego publicznego klucza ssh (w polu „opcje” w przypadku SSH1), który jest zainstalowany na serwerze (w pliku ~ / .ssh / Author_keys dla SSH1 , ~ / .ssh2 / autoryzacja dla SSH2).

Wykonaj swoje wymuszone polecenie, aby żądana powłoka nazywała się ...

Więcej: Możesz powiązać co najwyżej jedno polecenie wymuszone z danym klawiszem. Jeśli potrzebujesz wielu wymuszonych poleceń do różnych celów, musisz skonfigurować różne klucze. (Oczywiście, możesz umieścić wiele rzeczy w jednym skrypcie, który wywołujesz za pomocą polecenia wymuszonego. Pamiętaj jednak, że polecenia wymuszone są zawsze uruchamiane dla danego konta / klucza, jeśli użytkownik się zaloguje, niezależnie od tego, czy poprosił o coś innego do uruchomienia. Jeśli nadal chcesz uszanować pierwotne polecenie, sprawdź, jak wykorzystać $SSH_ORIGINAL_COMMANDzmienną ...)

Przeczytaj o „wymuszonych poleceniach” przez Google .

Kurt Pfeifle
źródło
Dobry towar. Ta grafika na stronie O'Reilly jest bardzo ładna. Jednak w moim szczególnym przypadku chcę mieć możliwość wymuszenia tego dla wszystkich użytkowników, nie tylko użytkowników, którzy poprawnie skonfigurowali swoje klucze. Nie mam również roota na serwerach, więc nie mogę edytować takich plików /etc/sshrc.
plinehan
Cóż, zawsze serwer (lub lepiej: ten, który sprawuje kontrolę nad serwerem) wywołuje strzały, gdy łączysz się z jego usługą ... „Właściciel” serwera decyduje, co można z nim zrobić. - Nie możesz wymusić niczego „dla dowolnego użytkownika (użytkowników)”, jeśli nie masz wyższych uprawnień niż oni.
Kurt Pfeifle,
Jeśli klient może uruchamiać dowolne polecenia, może również uruchomić dowolną powłokę jako polecenie.
Eric Woodruff,
@KurtPfeifle ten link do O'Reilly jest zepsuty
Brian Vandenberg
@BrianVandenberg: Dziękuję za podpowiedź. Teraz usunąłem ten link.
Kurt Pfeifle,
2

Możesz użyć tej -topcji, aby wymusić przydział pseudo-tty dla programu, który chcesz uruchomić, tak jakbyś wykonywał standardową powłokę. Następnie przekaż pożądaną powłokę jako zwykły stary argument.

Dzięki tej technice możesz nie tylko używać zainstalowanej powłoki, ale także otwierać vim i inne programy, które wymagają TTY, za pomocą jednego polecenia. Co jest fajne, jeśli piszesz skrypt powłoki, który gdzieś cię loguje i otwiera plik na vimie, htopie lub czymś podobnym.

me@my-machine $ ssh root@myhost -t bash
root@myhost:~# exit
Connection to myhost closed.
me@my-machine $ ssh root@myhost -t sh
# exit
Connection to myhost closed.
me@my-machine $ 

Nie jestem pewien, czy jest to powłoka logowania, ale istnieją opcje, dzięki którym bash będzie zachowywał się jak powłoka logowania, więc twoja powłoka również może to mieć.

Fábio Santos
źródło
1

Niespodziewanie widzę różne wyniki z następującymi:

uruchom w desce rozdzielczej:

ssh eric@172.17.1.241 /bin/bash -c "echo <(cat)"                                              
sh: 1: Syntax error: "(" unexpected

vs bash:

ssh eric@172.17.1.241 '/bin/bash -c "echo <(cat)"'                                            
/dev/fd/63

Wyświetlenie w pełni cytowanego polecenia działa zgodnie z oczekiwaniami.

Eric Woodruff
źródło
1
Nic dziwnego. Zdalny demon ssh działa skutecznie sh -c "$*". Tak więc biegniesz sh -c "/bin/bash -c echo <(cat)"; echosamo polecenie jest tylko przekazywane argumentu -c, i <(cat)jest całkowicie oddzielny argumentem.
Charles Duffy
0

Jakiś czas temu miałem do czynienia z podobną sytuacją, w której musiałem używać koprocesora ksh dla sqlplus i miałem tylko ssh, przez który muszą odbywać się odczyty i zapisy.

Sposobem na to jest umieszczenie wszystkich poleceń zależnych w jednej linii (użyj;) do / usr / bin / ksh na zdalnej maszynie. na przykład:

host="user@host"

db_conn="ora_user/passwd"

a="select * from dual;"

frmt="set heading off echo off feedback off verify off pagesize 0 termout off"

var=$(ssh ${host} "echo 'sqlplus -silent /nolog |&; sql_pid=\$!; print -p \"conn ${db_conn}\"; print -p \"${frmt}\"; print -p \"${a}\"; print -p \"exit\"; wait \$sql_pid' > /remote_dir/kshcmd.txt; awk '{print \$0}' /remote_dir/kshcmd.txt | /usr/bin/ksh")
aws
źródło