Судо над SSH, передаючи пароль, не потрібно:
Ви можете використовувати sudo over ssh, не змушуючи ssh мати псевдо-tty (без використання перемикача ssh "-t"), сказавши sudo не вимагати інтерактивного пароля та просто схопити пароль від stdin. Ви робите це за допомогою перемикача "-S" на sudo. Це змушує судо прослуховувати пароль на stdin і перестати слухати, коли він побачить новий рядок.
Приклад 1 - Проста віддалена команда
У цьому прикладі ми надсилаємо просту whoami
команду:
$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root
Ми говоримо sudo не видавати підказку, а брати його з stdin. Це робить пароль sudo абсолютно безшумним, тому єдиною відповіддю, яку ви отримуєте, є вихід whoami
.
Цей прийом має перевагу, що дозволяє запускати програми через sudo over ssh, які самі потребують введення stdin. Це тому, що sudo споживає пароль через перший рядок stdin, а потім дозволяє будь-якій програмі, яку він запускає, продовжувати захоплювати stdin.
Приклад 2 - Віддалена команда, яка потребує власного stdin
У наступному прикладі віддалена команда "кішка" виконується через sudo, і ми надаємо кілька додаткових рядків через stdin для відображення віддаленої кішки.
$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
Вихідний сигнал демонструє, що <remote_sudo_password>
лінія використовує sudo, а потім віддалений виконаний кіт демонструє додаткові лінії.
Приклад, де це було б корисно, якщо ви хочете використовувати ssh для передачі пароля привілейованій команді без використання командного рядка. Скажіть, якщо ви хочете встановити віддалений зашифрований контейнер над ssh.
Приклад 3 - Монтаж віддаленого контейнера VeraCrypt
У цьому прикладі сценарію ми віддалено монтуємо контейнер VeraCrypt через sudo без зайвого тексту-підказки:
#!/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
Слід зазначити, що у всіх наведених вище прикладах командного рядка (у всіх, крім скрипту) << EOF
конструкція в командному рядку призведе до того, що все, що введено, включаючи пароль, буде записано в .bash_history локальної машини. Тому настійно рекомендується, щоб у реальному використанні ви або використовували це робити цілком через сценарій, як, наприклад, приклад veracrypt вище, або, якщо в командному рядку потім введіть пароль у файл і перенаправляєте цей файл через ssh.
Приклад 1a - Приклад 1 без локального пароля командного рядка
Таким чином, першим прикладом стане:
$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root
Приклад 2а - Приклад 2 Без локального пароля командного рядка
а другим прикладом стане:
$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
Введення пароля в окремий файл непотрібне, якщо ви вкладаєте все в сценарій, оскільки вміст сценаріїв не закінчується вашою історією. Це все ще може бути корисним, якщо ви хочете дозволити користувачам, які не бачать пароль, виконувати сценарій.
ssh <user@server> sudo <script>
, оскільки я отримував помилкуsudo: no tty present and no askpass program specified