Как разрешить ввод пароля при выдаче команд на удаленном сервере?

Здесь мой script:

#!/bin/sh
if [ $# -lt 1 ]; then
 echo "Usage: $0 SERVER"
 exit 255
fi
ssh $1 'su;apachectl restart'

Я просто хочу, чтобы он заходил на сервер и перезапускал apache, но для этого нужны привилегии суперпользователя. Однако после того, как он выдает команду su, она не останавливается и ждет, когда я введу свой пароль. Могу ли я заставить это сделать это?

3 ответа

Посмотрите, работает ли это для вас! Это решение берет пароль перед выполнением SSH, хотя...

#!/bin/sh
if [ $# -lt 1 ]; then
 echo "Usage: $0 SERVER"
 exit 255
fi
read -s -p "Password: " PASSWORD
ssh $1 'echo $PASSWORD>su;apachectl restart'

Параметр -s предотвращает эхо-сообщение пароля при чтении его от пользователя.


Взгляните на ожидание. Лучшим способом выполнения таких операций является ожидание script. Вот пример, который я только что напечатал, чтобы дать вам начало, но все, что он делает прямо сейчас, показывает вам, как обрабатывать пароль в ожидании.

#!/usr/bin/expect -f
set timeout 60
set pswd [lindex $argv 0]
send "su\r"
match_max 2000
expect {
 -re "assword:$" {
 sleep 1
 set send_human {.2 .15 .25 .2 .25}
 send -h -- "$pswd\r"
 exp_continue
 } "login failed." {
 send "exit\r"
 log_user 1
 send_user "\r\nLogin failed.\r\n"
 exit 4
 } timeout {
 send "exit\r"
 log_user 1
 send_user "\r\nCommand timed out\r\n"
 exit 1
 } -re "(#|%)\\s*$" {
 # If we get here, then su succeeded
 sleep 1
 send "apachectl restart\r"
 expect {
 -re "(#|%)\\s*$" {
 send "exit\r"
 log_user 1
 send_user "\r\nApache restart Successful\r\n"
 exit 0
 } timeout {
 send "exit\r"
 log_user 1
 send_user "\r\nCommand timed out\r\n"
 exit 1
 }
 }
 } 
}


Изменение команды:

ssh -t $1 'sudo apachectl restart'

откроет TTY и позволит sudo взаимодействовать с удаленной системой, чтобы запросить пароль учетной записи пользователя, не сохраняя ее локально в памяти.

Возможно, вы также можете изменить свою конфигурацию sudo на удаленной системе, чтобы разрешить ее выполнение без пароля. Вы можете сделать это, добавив следующее в /etc/sudoers (выполните visudo и вставьте эту строку, заменив соответственно).

<username> ALL=NOPASSWD: ALL
</username>

Кроме того, я парень по безопасности, и я очень надеюсь, что вы понимаете, что подразумеваете возможность подключения SSH (предполагая без кодовой фразы на ключ) и выполнения удаленной команды с правами root. Если нет, вы действительно должны действительно переосмыслить свою настройку здесь.

[Изменить] Еще лучше, отредактируйте файл sudoers на разрешить запуск apachectl без пароля. Вставьте следующее и измените %staff в соответствии с вашей группой пользователей или измените его на свое имя пользователя без знака процента.

%staff ALL=(ALL) NOPASSWD: /usr/sbin/apachectl

Затем ваша команда должна быть просто изменена на:

ssh $1 'sudo apachectl restart'

licensed under cc by-sa 3.0 with attribution.