问题 SSH - 一种在不打开单独的SFTP会话的情况下传输文件的方法?


这不是一个编程问题,但与许多程序员有关......

假设我已经打开了另一台计算机的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”)和我想要传输的文件,那就太棒了。


4559
2018-01-13 19:53


起源

我明白了,你在寻找Fido时代的旧sz命令。男人,这让我回来了。 - Paul Tomblin
你只是想节省自己输入scp的第二个参数,你只是想问一个别名。 - Adam Bellaire


答案:


您可以设置这样的倒置传输连接w / ssh -Rport:127.0.0.1:22 user@host for scp back.

使用scp user @ host:port


7
2018-01-13 20:00



好主意。在每台涉及的机器上维护.ssh / config文件将为您节省更多的打字。 - innaM


这是我对这个问题的首选解决方案[如上所述 重复的问题 我问]。在创建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不能从命令行参数中获取环境变量。即使您可以选择动态端口,也无法确保在未先连接的情况下不在远程主机上使用它。


2
2018-02-09 18:16





在研究这个时,我找到了一个程序,它可以作为openssh客户端的替代品,zssh。

sudo apt-get install zssh
zssh user@remote
sudo apt-get install zssh
sz file.name
<ctrl>+<space>
rz

奇迹般有效。


2
2018-04-23 17:03



哇,一个很棒的选择!注意:在Mac上,您还可以执行“sudo port install lrzsz”,而不是Ctrl-Space(这是Spotlight的默认快捷方式),您可以按Ctrl-Shift-2(^ @) - Ilya Semenov
当我尝试它时根本没有工作 - 得到“sz:command not found”。 - AdamC


您可以使用sshfs挂载ssh连接。这样你就可以在同一个ssh连接中传输文件,同时使用你最喜欢的任何ssh客户端。如果您愿意,甚至可以将其设置为自动挂载。


2
2017-08-24 15:49





如果你正在修补东西(不应修补恕我直言),请看看 SSH-XFER


1
2018-01-13 20:05





您可以编写一个名为stransfer的bash脚本,该脚本将采用文件名参数,然后它会在scp命令中插入文件名,假设服务器和服务器上文件的路径不会更改。

或者如果文件始终相同,您可以在〜/ .bashrc文件中创建别名。

alias getwelcome ='scp avalys @ remotehost:/home/avalys/html/welcome.msg。'


1
2018-01-13 20:19





我有同样的想法,保罗·汤姆林在评论中写道。旧终端会话曾经使用x,y和z调制解调器协议和工具(sz 和 rz 对于z-modem变种来实现这样的事情。我不确定这些是否适用于ssh会话,但它可能值得一试。

芬克 供应一个 lrzsz 在Mac OS X上使用这些工具打包。

把它变成一个社区维基,因为在保罗第一次到达那里之后,我觉得得到代表是不好的...


1
2018-01-13 19:56