我经常通过 SSH 进入集群节点进行工作,处理后想将多个结果拉回本地机器进行分析。通常,为此我使用本地 shell 从服务器 scp,但这需要大量的路径操作。我更喜欢使用交互式 FTP 之类的语法,只需将文件从服务器“拉”到我的本地 pwd 即可。
另一个可能的解决方案是,通过某种方式自动将我的客户端计算机设置为 ssh 别名,以便
scp results home:~/results
将会按预期工作。
是否有一些不为人知的 SSH 技巧可以帮助我做到这一点?
工作于重力的答案,配置文件中的完整解决方案是这样的
本地.ssh/配置:
Host ex
HostName ssh.example.com
RemoteForward 10101 localhost:22
ssh.example.com .ssh/配置:
Host home
HostName localhost
Port 10101
这让我可以执行如下命令
scp results home:
将文件结果传输到我的家用机器。
答案1
我更喜欢使用像交互式 FTP 这样的语法,并将文件从服务器“拉”到我的本地密码。
使用sftp
。
(提示:如果您无法或不想打开新窗口,您可以按Enter、~、暂停 SSH 连接CtrlZ,传输文件,然后使用 恢复 SSH fg
。)
另一个可能的解决方案是,通过某种方式自动将我的客户端计算机设置为 ssh 别名
有几种方法。
ssh
和的静态别名scp
– 将其添加到您的~/.ssh/config
:Host home # If you don't have a domain name, check out DynDNS... # ...or just use your IP address. Hostname homepc.somedomain.tld # If necessary, uncomment: #User john #Port 1234
使用:
scp foo home:
(如果您在后面没有提供路径
:
,则文件将转到您的主目录。)使用
SSH_CLIENT
环境变量。export client=${SSH_CLIENT%% *} if [[ $client == *:* ]]; then client="[$client]" fi
将其放入
~/.profile
或或任何您想要的地方,然后在需要自己的地址时~/.bash_profile
使用。$client
scp foo "$client:"
混合两者。
~/.ssh/config
:Host client ProxyCommand ~/bin/reverse-connect %p
~/bin/reverse-connect
:#!/bin/sh if [[ $SSH_CLIENT ]]; then client=${SSH_CLIENT%% *} else echo "I don't know your address." >&2 exit 1 fi if [[ $client == *:* ]]; then client="[$client]" fi port=${1:-22} exec socat - "tcp:$client:$port"
使用:
scp foo client:
答案2
你试过 sshfs 吗?它很简单
> sshfs hostname: mountpoint
和
fusermount -u mountpoint
然后您可以使用所有经典和基本的文件操作命令。
答案3
您可以scp
从本地主机使用。使用类似 的命令scp server:file .
。
您的其他选择包括sftp
并且sshfs
如前所述。
对于所有这些,我都会使用授权密钥。使用密码保护密钥更安全。我使用 ssh-agent 根据需要将密钥提供给 ssh。命令 ssh-add 将提示您输入密钥的密码并将密钥加载到 ssh-agent 中。