用于从 MacOS X 10.10 ssh 到 Unix/Linux 服务器的 Shell 脚本

用于从 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 sendorinteract并且它正在寻找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 ,它会给我一条错误消息:“不会分配伪终端,因为标准输入不是终端”。使用 ssh -tt ,一旦登录到第二个服务器,它就会在命令提示符处停止,当我使用 ssh -T 时,它会挂起。 (可能在同一个地方,但只是不可见)

答案1

我认为您只是尝试通过 .NAT 从 NAT 后面的服务器复制文件gatewayserver

我建议你更简单的解决方案。

  1. 设置无密码身份验证(将私钥从您的台式机/Mac 放入两个提到的服务器)
  2. 使用类似的东西

    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

答案2

如果你看用于登录 ssh 服务器的 Shell 脚本你会注意到 shebang 线是

#!/usr/bin/expect

这是expect剧本,不是bash剧本。你需要安装预计如果您还没有。

答案3

进一步简化:

首先,您应该使用密钥而不是密码(您现在正在这样做)。

其次,将以下内容添加到您的~/.ssh/config

Host storageserver
    ProxyCommand ssh gatewayserver nc %h %p

第三,使用rsync使您的脚本成为单个命令:

rsync -havz storageserver:/path/retrievedfolder/ backup/retrievedfolder.$(date +%Y%m%d)

这比起点要短一些!

相关内容