1. 程式人生 > >linux指令碼實現自動輸入密碼

linux指令碼實現自動輸入密碼

使用Linux的程式設計師對輸入密碼這個舉動一定不陌生,在Linux下對使用者有嚴格的許可權限制,幹很多事情越過了許可權就得輸入密碼,比如使用超級使用者執行命令,又比如ftp、ssh連線遠端主機等等,如下圖

http://littlewhite.us/pic/20141110/ssh_login.png

那麼問題來了,在指令碼自動化執行的時候需要輸入密碼怎麼辦?比如你的腳本里有一條scp語句,總不能在指令碼執行到這一句時手動輸入密碼吧

針對於ssh或scp命令,可能有人會回答是建立信任關係,關於建立ssh信任關係的方法請自行百度Google,只需要兩行簡單的命令即可搞定,但這並不是常規的解決方案,如果是ftp連線就沒轍了,況且,你不可能為了執行某些命令去給每個你要連線的主機都手動建立ssh信任,這已經偏離了今天主題的本意,今天要說的是在腳本里自動輸入密碼,我們可以想象下,更優雅的方式應該是在腳本里自己配置密碼,當螢幕互動需要輸入時自動輸入進去,要達到這樣的效果就需要用到expect

安裝

CentOS下安裝命令很簡單,如下

sudo yum install expect

至於Mac使用者,可以通過homebrew安裝(需要先安裝homebrew,請自行Google)

brew install expect

測試指令碼

我們寫一個簡單的指令碼實現scp拷貝檔案,在腳本里配置密碼,儲存為scp.exp如下

#!/usr/bin/expect
set timeout 20

if { [llength $argv] < 2} {
    puts "Usage:"
    puts "$argv0 local_file remote_path"
    exit 1
}

set local_file [lindex $argv 0]
set remote_path [lindex $argv 1]
set passwd your_passwd

set passwderror 0

spawn scp $local_file $remote_path

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
    }
}

注意,第一行很重要,通常我們的腳本里第一行是#!/bin/bash,而這裡是你機器上expect程式的路徑,說明這段指令碼是由expect來解釋執行的,而不是由bash解釋執行,所以程式碼的語法和shell指令碼也是不一樣的,其中set passwd your_passwd設定成你自己的密碼,然後執行如下命令

./scp.exp ./local_file [email protected]:/xx/yy/

執行前確保scp.exp有執行許可權,第一個引數為你本地檔案,第二個為遠端主機的目錄,執行指令碼如果報錯“connect is timeout”,可以把超時設長一點,第二行set timeout 20

可以設定超時時間,單位是秒。指令碼執行效果如下

http://littlewhite.us/pic/20141110/scp_exp.png

還能做什麼

細心的同學一定發現了,其實expect提供的是和終端的一種互動機制,輸入密碼只是其中一種應用形式,只要是在終端阻塞需要輸入時,都可以通過expect指令碼完成自動輸入,比如前面腳本里配置了兩種互動場景,一種是終端提示"password:"時輸入密碼,還有一種是提示"yes/no)?"時輸入“yes”,如果和遠端主機是第一次建立連線,執行scp.exp指令碼效果是這樣的

http://littlewhite.us/pic/20141110/scp_exp_2.png

所以我們可以根據終端的提示來配置輸入命令,這樣就能達到了自動化的效果。至於處理其它互動場景,只需要照著上面的指令碼依葫蘆畫瓢就行了

相關推薦

linux指令碼實現自動輸入密碼

使用Linux的程式設計師對輸入密碼這個舉動一定不陌生,在Linux下對使用者有嚴格的許可權限制,幹很多事情越過了許可權就得輸入密碼,比如使用超級使用者執行命令,又比如ftp、ssh連線遠端主機等等,如下圖 那麼問題來了,在指令碼自動化執行的時候需要輸入密碼怎麼辦?比如你

linux 普通使用者登入後,執行 shell指令碼自動輸入密碼切換到root

1.首先安裝expect 2.2.編寫指令碼  /home/zukgit/suz.sh #!/bin/bash # #!/usr/bin/expect -f 使用這種方式 程式無法執行 expect -c " spawn su - expect \":\" send

ssh采用expect實現自動輸入密碼登錄、拷貝

cep .html tro from 效果 方式 目標 led 交互 1. 引言 最近做了一個項目,需要頻繁與另一臺主機進行文件的傳輸;中間想到了很多方式:FTP、samba、curl等,但是還是感覺scp最好用。 SCP使用教程可參閱:http://www.jb51.

ubuntu執行sh指令碼sudo自動輸入密碼

示例: sudo apt-get update  第一種方法:使用管道(上一個命令的 stdout 接到下一個命令的 stdin): #!/bin/bashecho password | sudo

shell指令碼自動輸入密碼

在shell指令碼中需要用root用的來執行指令:sudo 自動輸入密碼echo "password" | sudo -S netstat -tlnp       -S          The -S (stdin) option causes sudo to read t

linux使用expect實現自動登入(自動輸入密碼)

小蝙個人比較懶,每次都要登入多臺伺服器上工作,都要檢視note,什麼ip啦,埠啦,使用者名稱啦,密碼啦如果只有一個,那還是挺好記的,但是如果有10個,甚至更多,而且為了安全,每個伺服器的密碼都不一樣,ip和埠也不一樣,這樣就非常痛苦了,顧小蝙利用了一下expect軟體,用指令

Linux自動切換使用者指令碼自動輸入使用者名稱密碼

需要安裝tcl 和expect包 實現自動切換使用者: #!/usr/bin/expect -f spawn su - root expect "Password:" send "hadoop

bash指令碼自動輸入sudo的密碼

解決方法: echo + | (管道) 開始使用  echo "admin" | sudo service tomcat7 stop 始終提示輸入密碼 後來查看了下sudo命令的使用 man sudo 發現有如下的解釋: -S      

linux 指令碼實現程式自動安裝

#!/bin/bash //設定指令碼中所需命令的執行路徑 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH // $? 是取得上面執行命令的返回值,一般正確為0,錯誤為1 if [ "

Linux下後臺程式完成自動輸入密碼等互動行為的例子

今天要開發一個定時任務,然後加入cron列表中。但是有個問題擺在眼前,指令碼的執行中需要輸入資料庫密碼: mysql -u root -p << SQL use db; set names utf8; `cat task.sql` SQL 執行上述程式碼後,會

Shell指令碼互動之:自動輸入密碼

Shell指令碼互動之:自動輸入密碼 2016年04月09日 19:41:26 zhangjikuan 閱讀數:58208 標籤: Shell互動自動輸入密碼expect重定向管道 更多

指令碼連結 ssh 自動輸入密碼

上週工作中,遇見一些重複性的工作,為了方便,於是寫起了指令碼。 在這個指令碼中,需要通過 s s

python, linux shell 使用expect模組自動輸入密碼

Pexpect 是一個自動控制的 Python 模組,可以用來ssh、ftp、passwd、telnet 等命令列進行自動互動。 官方網站是 http://www.noah.org/ 通過它,可以實現類似 expect 的操作。 例如我們可以用它來寫python指令碼

linux使用shell指令碼實現自動登入scp傳輸檔案到其他伺服器

執行 sudo yum install expect  安裝自動登入expect工具 我們是配置了多臺伺服器進行控制多臺伺服器的檔案傳輸,使用scp命令進行copy檔案到指定伺服器的指定檔案目錄,一般複製到home目錄因為這個目錄對外有可執行許可權 下面我們看下會用到的檔

sudo 自動輸入密碼指令碼 alias別名

【alias簡介】alias 命令用於定義一個命令的簡寫格式,例如,alias lsproc='ls -l /proc',其中定義了一個新的命令lsproc,以後當輸入lsproc的時候,都會執行ls -l proc,顯示proc的目錄內容為了使alias永久生效,可以將

以一個例子來講ubuntu12.04下指令碼檔案內執行sudo 命令自動輸入密碼

原文連線http://blog.sina.com.cn/s/blog_951ca19b0101be96.html  在上一篇的文章中(發文時間為2012-10-30 16:09),掛載U盤指令碼檔案和解除安裝U盤指令碼檔案中都用到sudo命令,因此需要使用者手動的輸入密

指令碼中呼叫psql如何自動輸入密碼

設定環境變數PGPASSWORD #linux export PGPASSWORD=12345 #windows set PGPASSWORD=12345 使用密碼檔案.pgpass 在

通過expect免自動輸入密碼登陸遠程服務器

新建 文件 安裝 nbsp exp 輸入密碼 spa 執行 0.10 通過expect免自動輸入密碼登陸遠程服務器 1、前提必須已經安裝expect 2、新建login.sh,文件內容如下 #!/usr/bin/expect -f spawn ssh [email 

shell中scp自動輸入密碼

shell``` #!/bin/bash des_pass=testtest expect -c " spawn scp target/aaa-0.0.1.war [email protected]/* */:/home/GameUser/MagicvesselUserWeb/aaa-releas

Linux實現ssh免密碼登陸遠程服務器

Linux上實現ssh免密碼登陸遠程服務平常使用ssh登陸遠程服務器時,都需要使用輸入密碼,希望可以實現通過密鑰登陸而免除輸入密碼,從而可以為以後實現批量自動部署主機做好準備。 環境如下: IP地址 操作系統 服務器端 10.0.0.10 CentOS 6.5 x86 客戶端 10.0.0