2012-08-30 73 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 
      } 
     } 
    } 
} 
相關問題