linux 執行遠程linux上的shell腳本或者命令以及scp 上傳文件到ftp--免密碼登陸


場景:在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

結束!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM