Skip to main content

用於將文件上載到遠程服務器上的同一子目錄的Shell腳本

用於將文件上載到遠程服務器上的同一子目錄的Shell腳本

Geoffrey Carr

Web開發人員的一項非常常見的任務是將單個文件從開發盒上的子目錄上載到遠程服務器上的同一子目錄。不幸的是,這總是一個令人煩惱的手動過程,涉及在兩台服務器上切換目錄,浪費了大量的時間。

所以,我自己編寫了一個shell腳本來為我自動執行此操作,使用scp進行安全文件複製。 (重要的注意事項:ftp非常不安全,請改用WinSCP)

要解決的主要問題是我的開發機器上的WordPress安裝與我服務器上的安裝有不同的基本目錄。在我的開發機器上它是/ var / www,在我的服務器上更像是/ var / www / howtogeek / docs /。我決定在腳本開頭將它們移動到變量中,如下所示:

[email protected] RDIR=/var/www/howtogeek/docs LDIR=’/var/www’

請注意,腳本中的本地目錄(LDIR)在路徑中的每個/之前都有一個。這是因為我們稍後會在腳本中將其傳遞給sed命令,因此我們必須轉義這些值。我確定還有其他方法,但我不知道它。

接下來,我設置了自動ssh登錄。為此,您需要首先運行ssh keygen實用程序,如下所示:

ssh-keygen -t rsa

然後,您需要將〜/ .ssh / id_rsa.pub文件複製到遠程服務器上的〜/ .ssh / authorized_keys文件中。如果已在遠程服務器上創建〜/ .ssh目錄(可能要檢查),則可以運行此命令將密鑰複製到:

cat ~/.ssh/id_rsa.pub | ssh [email protected] ‘cat >> .ssh/authorized_keys’

現在我們已經有了自動ssh登錄,這將使用scp實用程序而無需密碼。現在讓我們看看我們將在腳本中使用的scp命令:

scp $1 $SSHSERVER:$RDIR`pwd|sed “s/${LDIR}//”`/`echo $1|sed ‘s/.*///’`

$ 1是您要傳遞給腳本的參數,用於您嘗試上傳的文件名。 $ SSHSERVER和$ RDIR是我們在腳本開頭設置的變量,用於設置user @ hostname和前一個遠程路徑。

以pwd | sed開頭的第一個塊採用當前目錄路徑並剝離與遠程服務器不匹配的路徑的前一部分,但保留路徑的其餘部分。例如,如果你在/ var / www / wp-content /中運行命令時,sed塊會根據我們的LDIR變量去掉/ var / www,但保留/ wp-content /部分。

第二個塊只是確保從傳遞給腳本的文件名中刪除整個前面的路徑,這樣你就可以得到文件名。

例如,如果您將腳本命名為up.sh並從文件中的本地/ var / www / wp-content / plugins /目錄運行它:

up.sh myplugin.php

這將由shell擴展如下:

scp myplugin.php [email protected]:/var/www/howtogeek/docs/wp-content/plugins/myplugin.php

我沒有嘗試根據文章創建自己的腳本文件,而是提供了下載。這樣,特殊字符不會出現任何問題......是的,我使用腳本上傳自己=)

下載geek-uploader.sh

把它放在你路徑的某個地方,然後根據你的意願命名。我將我的名字重命名為“up”,所以我只需輸入“up filename.txt”即可上傳。還要記得打開它並更改腳本開頭的變量以匹配您的環境。

此腳本應適用於具有* nix shell和scp實用程序的任何內容。我正在使用Ubuntu,但它應該適用於Solaris,OS X,甚至安裝了Cygwin的Windows。

Link
Plus
Send
Send
Pin