これが私のスクリプトです:
#!/bin/sh
if [ $# -lt 1 ]; then
echo "Usage: $0 SERVER"
exit 255
fi
ssh $1 'su;apachectl restart'
サーバーにログインしてApacheを再起動したいだけですが、それにはスーパーユーザー権限が必要です。ただし、su
コマンドを発行した後、停止せず、パスワードの入力を待ちます。私はそれをすることができますか?
これがあなたのために働くかどうか見てください!ただし、このソリューションは 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
オプションは、ユーザーからパスワードを読み取る際にパスワードがエコーされるのを防ぎます。
期待して見てください。このような操作を実行する最善の方法は、expect スクリプトを使用することです。これは、あなたに有利なスタートを切るために入力したばかりのサンプルですが、今のところは、パスワードを期待して処理する方法を示しているだけです。
#!/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>
適切に置き換えます)。
<username> ALL=NOPASSWD: ALL
また、私はセキュリティ担当者です。SSH接続(キーにパスフレーズがないことを前提としています)とリモートコマンドの実行をrootとして許可することの意味を理解していただければ幸いです。そうでない場合は、ここでセットアップを本当に、本当に、本当に再考する必要があります。
[編集]さらに良いことに、パスワードなしでapachectlのみを実行できるようにsudoersファイルを編集します。以下を挿入し、%staff
ユーザーのグループに一致するように変更するか、パーセント記号なしでユーザー名に変更します。
%staff ALL=(ALL) NOPASSWD: /usr/sbin/apachectl
次に、コマンドを次のように変更するだけです。
ssh $1 'sudo apachectl restart'