这里是我的脚本:如何在远程服务器上发出命令时允许输入密码?
#!/bin/sh
if [ $# -lt 1 ]; then
echo "Usage: $0 SERVER"
exit 255
fi
ssh $1 'su;apachectl restart'
我只是希望它登录到服务器并重新启动Apache,但它需要超级用户权限的做到这一点。但是,在发出su
命令后,它不会停止并等待我输入密码。我能做到吗?
这里是我的脚本:如何在远程服务器上发出命令时允许输入密码?
#!/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
选项防止呼应的密码,同时从用户阅读。
修改您的命令:
ssh -t $1 'sudo apachectl restart'
将打开一个TTY,并允许sudo来与远程系统进行交互,而本地存储在内存中,要求用户帐户的密码。
您也可以在远程系统上修改您的sudo配置以允许在没有密码的情况下执行。您可以通过添加以下到/etc/sudoers
(执行visudo命令,并插入此行,适当替代<username>
)
<username> ALL=NOPASSWD: ALL
而且,我是一个安全的家伙,我真希望你明白允许SSH的含义做到这一点连接(假设没有密钥上的密码)和远程命令以root身份执行。如果没有,你真的应该真的重新考虑你的设置。
[编辑]更好,编辑您的sudoers文件到allow only apachectl to run without a password。插入以下内容并修改%staff
以匹配您的用户组,或将其更改为不带百分号的用户名。
%staff ALL=(ALL) NOPASSWD: /usr/sbin/apachectl
,您的命令应该简单地改为:
ssh $1 'sudo apachectl restart'
看看期待。执行此类操作的最佳方式是通过期望脚本。下面是我刚输入的一个样例,可以让您领先一步,但现在所做的只是向您展示如何处理密码。
#!/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
}
}
}
}
'-s'似乎并不'sh'工作 - 工作在'bash'虽然。但不管怎样,'苏'只是告诉我'抱歉'。不知道你被允许通过这样的密码... – mpen