我正在尝试使用 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
orinteract
并且它正在寻找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
。
我建议你更简单的解决方案。
- 设置无密码身份验证(将私钥从您的台式机/Mac 放入两个提到的服务器)
使用类似的东西
ssh -MNf -L 60022:storageserver:22 username@gatewayserver
通过 建立 ssh 隧道
gatewayserver
。现在您的 Mac 端口60002
已直接连接到22
的端口storageserver
。此时您可以直接通过此隧道复制文件:
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
答案3
进一步简化:
首先,您应该使用密钥而不是密码(您现在正在这样做)。
其次,将以下内容添加到您的~/.ssh/config
Host storageserver
ProxyCommand ssh gatewayserver nc %h %p
第三,使用rsync
使您的脚本成为单个命令:
rsync -havz storageserver:/path/retrievedfolder/ backup/retrievedfolder.$(date +%Y%m%d)
这比起点要短一些!