場景:在linux A 上執行Linux B上的shell腳本和命令
步驟1.設置ssh免登陸
1.SSH無密碼登錄
# 本地服務器執行(A機器):生成密鑰對
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cp ~/.ssh/id_dsa.pub authorized_keys
如果有郵箱的話,使用
ssh-keygen -t rsa -C anl@163.com
cat ~/.ssh/id_rsa.pub
然后使用winscp或者fileziall之類的文件傳輸,將authorized_keys上傳到B上
# 遠程服務器執行(B機器):用公鑰給遠程機器授權,首先需要將本地公鑰拷貝到遠程服務器上,遠程機器授權全后,可以刪除公鑰
cat authorized_keys >> ~/.ssh/authorized_keys
操作完以后,A機器就可以無密碼SSH到B機器上了
步驟2.執行具體命令
ssh root@192.168.56.2 "sh /root/test.sh"
另外免密碼登陸還有以下兩種方式:
方法1:sshpass
(1)安裝sshpass:
unbuntu系統:apt-get install sshpass
centos系統:
方法1:
cd mytools_tmp/
wget http://download.opensuse.org/repositories/home:Strahlex/CentOS_CentOS-6/home:Strahlex.repo
yum install sshpass
或者方法2:curl -O -L http://downloads.sourceforge.net/project/sshpass/sshpass/1.05/sshpass-1.05.tar.gz && tar xvzf sshpass-1.05.tar.gz && cd sshpass-1.05 && ./configure && make && sudo make install
或者方法3:
wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
yum --enablerepo=epel -y install sshpass
mac 系統:
brew install https://raw.github.com/eugeneoden/homebrew/eca9de1/Library/Formula/sshpass.rb
(2)使用sshpass 和scp復制文件到ftp,比如ftp的用戶名為test,密碼123456
sshpass -p "123456" scp -v files.zip $ftp_server/$ftp_pass
此處需要說到一點,一個我遇到的問題:我在jenkins slave的mac機器上安裝了sshpass,在mac機上執行sshpass 和scp傳文件是沒有問題的,但是我在jenkins master的centos系統上,調用位於jenkins slave機器上(Mac機)的sshpass就會提示命令找不到 !!!! 如何解決這個問題呢? 方法是:在jenkins slave 的mac機器上使用which sshpass查找sshpass命令的路徑,比如我的顯示的是/usr/local/bin/sshpass, 那么調用時直接寫這個路徑(換句話,就是設置到環境變量中,調用時提前執行source 環境變量文件)
方法2:使用expect 腳本來自動輸入密碼
該方式主要是為了截獲界面輸出,expect用於自動化地執行linux環境下的命令行交互任務,例如scp、ssh之類需要用戶手動輸入密碼然后確認的任務。有了這個工具,定義在scp過程中可能遇到的情況,然后編寫相應的處理語句,就可以自動地完成scp操作了。
(1)設置腳本expect_scp腳本,傳入參數包含:主機 用戶名 密碼 源文件路徑 目的文件路徑
#!/usr/bin/expect
set timeout 10
set host [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set src_file [lindex $argv 3]
set dest_file [lindex $argv 4]
spawn scp $src_file $username@$host:$dest_file
expect {
"(yes/no)?"
{
send "yes\n"
expect "*assword:" { send "$password\n"}
}
"*assword:"
{
send "$password\n"
}
}
expect "100%"
expect eof
備注:以上腳本第一行,指定了expect的路徑,與shell腳本相同,這一句指定了程序在執行時到哪里去尋找相應的啟動程序。
如果將以上腳本保存為expect_scp文件,則在shell下執行時需要按以下的規范來輸入命令:
./expect_scp 192.168.75.130 root 123456 /root/src_file /root/dest_file
出錯解析:
(1)如果出現了報錯:
/usr/bin/expect: bad interpreter: No such file or directory
原因時沒有安裝expect,解決辦法如下:
yum install tcl-devel
yum install expect
(2)但是按照上面的腳本,會出現上傳文件大小不一致的問題,
解決方法:
set timeout -1
參考:https://blog.csdn.net/ashic/article/details/46914589
備注:以上過程第一次的時候上傳文件會上傳不上,那是應為沒有確認永久添加主機,第一次,先執行下ssh $user@$host,看到詢問是否永久添加主機,輸入yes,以后就不需要了,如下:
參考:http://blog.csdn.net/nfer_zhuang/article/details/42646849
結束!