这不是一个编程问题,但与许多程序员有关......
假设我已经打开了另一台计算机的SSH会话。
remote:html avalys $ ls
welcome.msg index.html readme.txt
remote:html avalys $
是否有任何命令可以在我的远程shell中键入,它会立即将当前目录中的一个文件(例如welcome.msg)传输到我的本地计算机,即
remote:html avalys $ stransfer welcome.msg
获取/home/avalys/html/welcome.msg到welcome.msg
/home/avalys/html/welcome.msg 100%23KB 23.3KB / s 00:00
remote:html avalys $
我知道这样做的唯一方法是在SSH会话中打开并行SFTP会话和CD到我当前的目录,这是远程管理服务器时的真正PITA。
编辑:我知道使用反向sftp / scp连接的可能性,但这涉及更多的打字。如果我只能键入某个命令的名称(例如“stransfer”)和我想要传输的文件,那就太棒了。
您可以设置这样的倒置传输连接w / ssh -Rport:127.0.0.1:22 user@host for scp back.
使用scp user @ host:port
这是我对这个问题的首选解决方案[如上所述 重复的问题 我问]。在创建ssh会话时设置反向ssh隧道。这可以通过两个bash函数轻松实现:需要在本地主机上定义grabfrom(),而在远程主机上定义grab()。您可以根据需要添加您使用的任何其他ssh变量(例如-X或-Y)。
function grabfrom() { ssh -R 2202:127.0.0.1:22 ${@}; };
function grab() { scp -P 2202 $@ localuser@127.0.0.1:~; };
用法:
localhost% grabfrom remoteuser@remotehost
password: <remote password goes here>
remotehost% grab somefile1 somefile2 *.txt
password: <local password goes here>
正面:
- 它在OpenSSH之外的任何主机上都没有特殊软件
- 它适用于本地主机位于NAT路由器后面的情况
- 它可以实现为一对两个单行bash函数
劣势:
- 它使用固定端口号,因此:
- 不能与远程主机的多个连接一起使用
- 可能与使用远程主机上的端口的进程冲突
- 它需要localhost接受ssh连接
- 它需要一个特殊的命令来启动会话
- 它不会隐式处理对localhost的身份验证
- 它不允许在localhost上指定目标目录
- 如果从多个localhosts抓取到同一个远程主机,ssh将不会更改密钥
未来的工作:
这仍然非常糟糕。显然,可以通过适当地设置ssh键来处理身份验证问题,通过向grab()添加参数来更容易地允许指定远程目录
解决其他负面问题更加困难。选择一个动态端口会很好,但据我所知,没有优雅的方法可以将该端口传递给远程主机上的shell;据我所知,OpenSSH不允许您在远程主机上设置任意环境变量,而bash不能从命令行参数中获取环境变量。即使您可以选择动态端口,也无法确保在未先连接的情况下不在远程主机上使用它。
在研究这个时,我找到了一个程序,它可以作为openssh客户端的替代品,zssh。
sudo apt-get install zssh
zssh user@remote
sudo apt-get install zssh
sz file.name
<ctrl>+<space>
rz
奇迹般有效。
您可以使用sshfs挂载ssh连接。这样你就可以在同一个ssh连接中传输文件,同时使用你最喜欢的任何ssh客户端。如果您愿意,甚至可以将其设置为自动挂载。
如果你正在修补东西(不应修补恕我直言),请看看 SSH-XFER
您可以编写一个名为stransfer的bash脚本,该脚本将采用文件名参数,然后它会在scp命令中插入文件名,假设服务器和服务器上文件的路径不会更改。
或者如果文件始终相同,您可以在〜/ .bashrc文件中创建别名。
alias getwelcome ='scp avalys @ remotehost:/home/avalys/html/welcome.msg。'
我有同样的想法,保罗·汤姆林在评论中写道。旧终端会话曾经使用x,y和z调制解调器协议和工具(sz
和 rz
对于z-modem变种来实现这样的事情。我不确定这些是否适用于ssh会话,但它可能值得一试。
芬克 供应一个 lrzsz
在Mac OS X上使用这些工具打包。
把它变成一个社区维基,因为在保罗第一次到达那里之后,我觉得得到代表是不好的...