Shell-Script

從 MacOS X 10.10 SSH 到 Unix/Linux 伺服器的 Shell 腳本

  • October 30, 2016

我正在嘗試使用 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.

我建議你更簡單的解決方案。

  1. 設置無密碼身份驗證(將私鑰從您的桌面/Mac 放到兩個提到的伺服器上)
  2. 使用類似的東西
ssh -MNf -L 60022:storageserver:22 username@gatewayserver

通過設置 ssh 隧道gatewayserver。現在您的 Mac 埠60002已直接連接22storageserver. 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

引用自:https://unix.stackexchange.com/questions/185376