这是我的剧本:
#!/bin/sh
if [ $# -lt 1 ]; then
echo "Usage: $0 SERVER"
exit 255
fi
ssh $1 'su;apachectl restart'
我只是希望它登录到服务器并重新启动apache,但它需要超级用户权限来执行此操作。但是,在它发出su
命令后,它不会停止并等待我输入我的密码。我可以这样做吗?
答案 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'