我們常用sudo,ssh、ftp命令操作服務器或者修改權限的時候都會要求輸入password,但是shell腳本運行中該如何交互實現自動輸入密碼呢?
下面總結三種實現方法。
一、重定向:
用重定向方法實現交互的前提是指令需要有參數來指定密碼輸入方式,如ftp就有-i參數來指定使用標准輸入來輸入密碼
shell用重定向作為標准輸入的用法是:
ftp -i -n 192.168.15.16<<EOF user john pw@2018 ls EOF
二:管道:
跟重定向一樣,指令同樣要有參數來指定密碼輸入方式,如sudo的-S參數,passwd的-stdin參數,所以實現sudo自動輸入密碼的腳本如下:其中pw@2018為密碼
echo 'pw@2018' | sudo -S cp fileone /tmp
實現自動修改密碼的腳本寫法如下:
echo 'password' | passwd -stdin username
三:expect:
上面介紹的兩種方法前提條件是指令有參數來設定密碼輸入方式,像ssh指令就沒有這樣的參數,第三種交互方式就派上用場了,expect就是用來做交互用的,基本任何交互登錄的場合都能使用,但是需要安裝expect包。
CentOS下安裝命令很簡單:
sudo yum install expect
Mac用戶,可以通過homebrew安裝(需要先安裝homebrew)
brew install expect
測試腳本:實現rsync定時同步遠程服務器文件
我們寫一個簡單的腳本,在腳本里配置密碼,保存為scp.exp如下:
1,先寫好rsync.ex腳本文件,在腳本里定義變量和保存密碼
#!/usr/bin/expect
set timeout 20
if { [llength $argv] < 2} {
puts "Usage:"
puts "$argv0 remote_path local_file"
exit 1
}
set remote_path [lindex $argv 0]
set local_file [lindex $argv 1]
set passwd yourpassword
set passwderror 0
spawn rsync -avz --delete --exclude 'var' $remote_path $local_file
expect {
"*assword:*" {
if { $passwderror == 1 } {
puts "passwd is error"
exit 2
}
set timeout 1000
set passwderror 1
send "$passwd\r"
exp_continue
}
"*es/no)?*" {
send "yes\r"
exp_continue
}
timeout {
puts "connect is timeout"
exit 3
}
}
腳本說明:
> 如果是sh腳本,第一行是#!/bin/bash,而這里是你機器上expect程序的路徑,說明這段腳本是由expect來解釋執行的
> 第一句是設定超時時間為20s
> set passwd yourpassword設置成你自己的密碼
> spawn是expect的語句,執行命令前都要加這句
2,把rsync.ex寫到定時任務里
crontab -e
編輯如下,根據你自己的具體情況設置crontab參數和rsync.ex文件路徑:
相關文章:CentOS等Linux服務器配置使用Rsync同步及Crontab定時任務
單獨運行rsync.ex文件,如下:
expect /home/backup/rsync.ex root@45.234.21.101:/home/backup/* /local/backup/
注意:expect跟bash類似,使用時要先登錄到expect,所以首行要指定使用expect
在運行腳本時候要expect rsync.ex,不能sh rsync.ex了
