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 whoami
polecenie:
$ 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 << EOF
konstruktu 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