Sudo przez SSH przekazując hasło, tty nie jest wymagane:
Możesz użyć sudo zamiast ssh bez zmuszania ssh do posiadania pseudo-tty (bez użycia przełącznika ssh "-t"), mówiąc sudo, aby nie wymagał interaktywnego hasła i po prostu przechwytywał hasło ze standardowego wejścia. Robisz to za pomocą przełącznika "-S" w sudo. To sprawia, że sudo nasłuchuje hasła na stdin i przestaje nasłuchiwać, gdy zobaczy nową linię.
Przykład 1 - Proste zdalne polecenie
W tym przykładzie wysyłamy proste whoamipolecenie:
$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root
Mówimy sudo, aby nie wydawało zachęty i pobierało dane wejściowe ze standardowego wejścia. To sprawia, że hasło sudo przechodzi całkowicie cicho, więc jedyną odpowiedzią, którą otrzymujesz, jest wyjście whoami.
Ta technika ma tę zaletę, że umożliwia uruchamianie programów przez sudo przez ssh, które same wymagają wejścia stdin. Dzieje się tak, ponieważ sudo zużywa hasło w pierwszym wierszu stdin, a następnie pozwala dowolnemu programowi na kontynuowanie pobierania stdin.
Przykład 2 - zdalne polecenie, które wymaga własnego standardowego wejścia
W poniższym przykładzie zdalne polecenie „cat” jest wykonywane przez sudo, a my udostępniamy dodatkowe wiersze przez stdin, aby zdalny kot mógł wyświetlić.
$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
Dane wyjściowe pokazują, że <remote_sudo_password>linia jest używana przez sudo i że zdalnie wykonany cat wyświetla dodatkowe linie.
Przykładem sytuacji, w której byłoby to korzystne, jest użycie ssh do przekazania hasła do uprzywilejowanego polecenia bez korzystania z wiersza poleceń. Powiedzmy, jeśli chcesz zamontować zdalny zaszyfrowany kontener przez ssh.
Przykład 3 - Montowanie zdalnego kontenera VeraCrypt
W tym przykładowym skrypcie zdalnie montujemy kontener VeraCrypt przez sudo bez dodatkowego tekstu zachęty:
#!/bin/sh
ssh user@server cat \| sudo --prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
SudoPassword
VeraCryptContainerPassword
EOF
Należy zauważyć, że we wszystkich przykłady wiersza polecenia powyżej (wszystko z wyjątkiem scenariusza) Do << EOFkonstruktu w wierszu poleceń spowoduje, że wszystko wpisane, w tym hasło, które mają być rejestrowane w lokalnych .bash_history urządzenia. Dlatego zdecydowanie zaleca się, aby w prawdziwym świecie używać go w całości za pomocą skryptu, jak powyższy przykład veracrypt, lub, jeśli w wierszu poleceń, umieścić hasło w pliku i przekierować ten plik przez ssh.
Przykład 1a - Przykład 1 bez lokalnego hasła wiersza poleceń
Tak więc pierwszy przykład wyglądałby następująco:
$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root
Przykład 2a - Przykład 2 bez lokalnego hasła wiersza poleceń
a drugi przykład to:
$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
Umieszczenie hasła w osobnym pliku nie jest konieczne, jeśli umieszczasz całość w skrypcie, ponieważ zawartość skryptów nie trafia do historii. Jednak nadal może być przydatne, jeśli chcesz zezwolić użytkownikom, którzy nie powinni widzieć hasła, na wykonanie skryptu.
ssh <user@server> sudo <script>, ponieważ otrzymywałem błądsudo: no tty present and no askpass program specified