這裏是我的腳本:如何在遠程服務器上發出命令時允許輸入密碼?
#!/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