2011-03-22 108 views
2

我需要編寫腳本來將遠程服務器文件複製到服務器後端的服務器上。類似如下:如何在shell腳本中從遠程服務器複製文件?

#!/usr/bin/expect -f 
    spawn /usr/local/bin/scpdata.sh 
    set timeout 3000 
    expect "[email protected]'s password:" 
    set timeout 3000 
    send "xxxx" 
    set timeout 3000 
    send "exit\r" 
    expect eof 

scpdata.sh文件

#!/bin/bash 
    scp [email protected]:/tmp/11-03-15_03:00:01.tar.gz /tmp 

但這不行,哪裏是問題,怎麼辦呢?請幫助

+0

@ user670809:究竟是什麼出了問題? scp命令? – Heisenbug 2011-03-22 08:46:18

回答

2

我建議你使用公共密鑰認證,而不是(生成ssh-keygen客戶端上的公鑰/私鑰對,增加公衆(.ssh/id.pub默認)鍵.ssh/authorized_keys服務器—看到手冊頁)。比你可以:

  • 給該鍵的密碼使用ssh-agent,或
  • 使用無密碼的重要進步。

在後一種情況下,我建議你限制的關鍵在於一個特定的命令。我不知道如何設置scp命令,但是

ssh [email protected] 'cat /tmp/11-03-15_03:00:01.tar.gz' > /tmp/11-03-15_03:00:01.tar.gz 

是等價的。你只寫command="命令".ssh/authorized_keys你的關鍵的前面。與ssh服務器相比,使用此密鑰進行授權時,無論在ssh命令行上給出的是什麼,都將始終運行指定的命令。這限制了攻擊者在訪問您的無密碼密鑰時可能造成的損害。

如果你需要改變文件的名字,你需要在服務器端編寫一個腳本,它將取出名稱$SSH_ORIGINAL_COMMAND(這就是服務器端腳本獲取ssh上的任何內容的位置命令行),檢查它是允許的文件之一,並將其​​記錄下來。

+0

是的,它可以使用ssh-keygen,但有時不能改變服務器中的任何東西,這仍然是問題。 – user670809 2011-03-22 08:56:14

+0

@ user670809:你只需把鑰匙在一個文件中,你登錄爲用戶,這是可能的,當你有簡單的ssh訪問的主目錄。任何不可能的更高級的配置可能會由知道(或至少會理解)爲什麼使用以及如何設置ssh公鑰驗證的合格系統管理員完成。 – 2011-03-22 12:27:06

+0

thans,1月你是對的, – user670809 2011-03-24 01:30:14

0
  1. 你永遠不「打輸入」當你發送的密碼:send "xxxx\r"
  2. set timeout 3000實際上並沒有暫停 - 它的超時值設置爲3000秒(50分鐘)。如果你需要暫停,sleep 3
    • 如果您期望的模式是正確的,你幾乎不必明確地睡覺。使用exp_internal 1來調試你的模式。
  3. 設置SSH密鑰,你不需要指望腳本的。
相關問題