3

これが私のスクリプトです:

#!/bin/sh

if [ $# -lt 1 ]; then
    echo "Usage: $0 SERVER"
    exit 255
fi

ssh $1 'su;apachectl restart'

サーバーにログインしてApacheを再起動したいだけですが、それにはスーパーユーザー権限が必要です。ただし、suコマンドを発行した後、停止せず、パスワードの入力を待ちます。私はそれをすることができますか?

4

3 に答える 3

5

これがあなたのために働くかどうか見てください!ただし、このソリューションは 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オプションは、ユーザーからパスワードを読み取る際にパスワードがエコーされるのを防ぎます。

于 2012-08-30T19:29:41.730 に答える
3

期待して見てください。このような操作を実行する最善の方法は、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
            }
        }
    } 
}
于 2012-08-30T19:45:55.973 に答える
2

コマンドを次のように変更します。

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'
于 2012-08-30T19:31:04.843 に答える