Shell-Script
從 MacOS X 10.10 SSH 到 Unix/Linux 伺服器的 Shell 腳本
我正在嘗試使用 MacOSX 中的 bash 腳本 ssh 進入伺服器。
#!/bin/bash spawn ssh username@gatewayserver expect "password" send "Mypassword\r" interact spawn ssh username@storageserver expect "password" send "Mypassword\r" interact cd /path spawn scp -r retrievedfolder username@gatewayserver:/path/ expect "password" send "Mypassword\r" interact exit exit spawn scp -r username@gatewayserver:/path/retrievedfolder . expect "password" send "Mypassword\r" interact spawn ssh username@gatewayserver expect "password" send "Mypassword\r" interact rm -r retrievedfolder/ exit mv -nv -- "$retrievedfolder" "$retrievedfolder.$(date +%Y%m%d)" mv /retrievedfolder /backup
如果您可以遵循可能冗餘的程式碼,那麼目標是登錄網關伺服器以訪問儲存伺服器。cd 到相應的文件夾。將我想要的文件夾安全複製到網關伺服器上的目錄,然後將文件從網關伺服器複製到桌面。然後我想從網關伺服器中刪除檢索到的文件夾(儲存限制)並將複製的文件夾移動到桌面上的文件夾中,並將目前日期附加到文件名的末尾。我認為如果我在執行 linux 但 MacOS 上的 bash 無法辨識
spawn
send
,或者interact
它正在尋找expect
.在 Stephen Kitt 和 webKnjaZ 的幫助下,我的程式碼看起來更像這樣:
#!/bin/bash ssh username@gatewayserver 'ssh username@storageserver; cd /path/; scp -r retrievedfolder username@gatewayserver:/path/' scp -r username@gatewayserver:/path/retrievedfolder . ssh username@gatewayserver 'rm -r retrievedfolder/' mv -nv -- "retrievedfolder" "retrievedfolder.$(date +%Y%m%d)" mv retrievedfolder.$(date +%Y%m%d)/ backup/
正確設置無密碼 SSH 後,它幾乎可以正常工作。如果沒有 ssh -tt,它會給我一條錯誤消息:“不會分配偽終端,因為 stdin 不是終端”。使用 ssh -tt 登錄到第二台伺服器後,它會在命令提示符處停止,當我使用 ssh -T 時,它會掛起。(可能在同一個地方,但只是不可見)
我認為您只是試圖通過
gatewayserver
.我建議你更簡單的解決方案。
- 設置無密碼身份驗證(將私鑰從您的桌面/Mac 放到兩個提到的伺服器上)
- 使用類似的東西
ssh -MNf -L 60022:storageserver:22 username@gatewayserver
通過設置 ssh 隧道
gatewayserver
。現在您的 Mac 埠60002
已直接連接22
到storageserver
. 3. 此時您可以直接通過此隧道複製文件:scp -P 60022 -R username@localhost:/path/to/folder .
將這些命令放入您的 bash 腳本中,您將實現您想要的。
升級版:
把它們放在一起,這是完整的腳本:
#!/bin/bash # set up tunnel ssh -MNf -L 60022:storageserver:22 gatewayserver_username@gatewayserver || true # copy files __directly__ into correct backup folder scp -P 60022 -R "storageserver_username@localhost:/remote/path/to/retrievedfolder/at/storageserver" "/local/path/to/backup/retrievedfolder.`date +%Y%m%d`"
先決條件(在您的 Mac 上只執行一次):
# Create SSH keys @ local machine ssh-keygen # Put your local SSH key to the gateway server ssh-copy-id gatewayserver_username@gatewayserver # Enable tunnel (will not ask your password if previous steps are correct) ssh -MNf -L 60022:storageserver:22 gatewayserver_username@gatewayserver # Put your local SSH key to the storageserver server ssh-copy-id -p 60022 storageserver_username@localhost