如何在远程服务器上发出命令时允许输入密码?

时间:2012-08-30 19:19:02

标签: ssh freebsd sh su

这是我的剧本:

#!/bin/sh

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

ssh $1 'su;apachectl restart'

我只是希望它登录到服务器并重新启动apache,但它需要超级用户权限来执行此操作。但是,在它发出su命令后,它不会停止并等待我输入我的密码。我可以这样做吗?

3 个答案:

答案 0 :(得分: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选项可防止在从用户处读取密码时回显密码。

答案 1 :(得分: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
            }
        }
    } 
}

答案 2 :(得分:2)

将您的命令修改为:

ssh -t $1 'sudo apachectl restart'

将打开TTY并允许sudo与远程系统交互以询问用户帐户的密码,而无需将其本地存储在内存中。

您也可以修改远程系统上的sudo配置,以便在没有密码的情况下执行。您可以通过将以下内容添加到/etc/sudoers来执行此操作(执行visudo并插入此行,恰当地替换<username>。)

<username> ALL=NOPASSWD: ALL

另外,我是一个安全人员,我真的希望你理解允许SSH连接(假设没有密钥上的密码)和远程命令执行的含义。如果没有,你应该真的,真的,真的重新考虑你的设置。

[编辑]更好的是,将您的sudoers文件编辑为allow only apachectl to run without a password。插入以下内容并修改%staff以匹配您的用户组,或将其更改为您的用户名而不使用百分号。

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

然后你的命令应该简单地改为:

ssh $1 'sudo apachectl restart'