2012-08-30 45 views
3

这里是我的脚本:如何在远程服务器上发出命令时允许输入密码?

#!/bin/sh 

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

ssh $1 'su;apachectl restart' 

我只是希望它登录到服务器并重新启动Apache,但它需要超级用户权限的做到这一点。但是,在发出su命令后,它不会停止并等待我输入密码。我能做到吗?

回答

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选项防止呼应的密码,同时从用户阅读。

+0

'-s'似乎并不'sh'工作 - 工作在'bash'虽然。但不管怎样,'苏'只是告诉我'抱歉'。不知道你被允许通过这样的密码... – mpen

2

修改您的命令:

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' 
+0

不错的第一篇文章。感谢分享并继续发帖! – shellter

+0

我在服务器上没有'sudo'。 – mpen

+0

马克,我认为你仍然可以按照第一个建议,但修改它为:ssh -t $ 1'su; apachectl restart' - -t是重要部分。 – jth

3

看看期待。执行此类操作的最佳方式是通过期望脚本。下面是我刚输入的一个样例,可以让您领先一步,但现在所做的只是向您展示如何处理密码。

#!/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 
      } 
     } 
    } 
} 
相关问题