SSH - 一种无需打开单独的 SFTP 会话即可传输文件的方法?

Posted

技术标签:

【中文标题】SSH - 一种无需打开单独的 SFTP 会话即可传输文件的方法?【英文标题】:SSH - a way to transfer files without opening a separate SFTP session? 【发布时间】:2010-10-01 05:31:20 【问题描述】:

不是真正的编程问题,但与许多程序员相关......

假设我打开了与另一台计算机的 SSH 会话。

远程:html avalys$ ls 欢迎.msg index.html readme.txt 远程: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 远程:html avalys$

我知道的唯一方法是在 SSH 会话中打开一个并行 SFTP 会话和 CD 到我的当前目录,远程管理服务器时这是一个真正的 PITA。

编辑:我知道使用反向 sftp/scp 连接的可能性,但这涉及更多的输入。如果我可以只输入某个命令的名称(例如“stransfer”)和我想要传输的文件,然后让它正常工作,那就太好了。

【问题讨论】:

我明白了,您正在寻找类似于 Fido 时代的旧 sz 命令的东西。伙计,这让我回来了。 如果您只是想避免键入 scp 的第二个参数,您只是在询问别名。 【参考方案1】:

在学校,如果我将文件从一个 linux 系统传输到另一个,我通常使用 ssh 远程,然后使用 scp 将文件从远程系统传输回我的计算机。不确定这是否是您正在寻找的内容,或者这是否适用于您的情况,但这通常是我不得不打开另一个终端窗口的方式。

澄清一下,如果您不熟悉 scp,您仍然需要指定要将文件放在计算机上的位置,但无论如何对我来说,这通常比文件的位置更容易记住在远程计算机上。这是一个可能有用的链接:http://www.computerhope.com/unix/scp.htm

【讨论】:

【参考方案2】:

你可以设置这样一个反向传输连接w/

ssh -Rport:127.0.0.1:22 user@host

scp返回。

使用scp user@host:port 访问它。

【讨论】:

好主意。在涉及的每台机器上维护一个 .ssh/config 文件将节省您更多的打字时间。【参考方案3】:

如果您正在修补东西(恕我直言不应该修补),请查看ssh-xfer

【讨论】:

【参考方案4】:

你可以编写一个名为 stransfer 的 bash 脚本,它接受一个文件名参数,然后它会在 scp 命令中插入文件名,假设服务器和服务器上文件的路径没有改变。

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

别名 getwelcome='scp avalys@remotehost:/home/avalys/html/welcome.msg.'

【讨论】:

【参考方案5】:

我的想法与 Paul Tomblin 在对该问题的评论中所写的想法相同。旧的终端会话使用 x-、y- 和 z-modem 协议和工具(szrz 用于 z-modem 变体)来实现类似的功能。我不确定这些是否可以在 ssh 会话中使用,但可能值得一试。

Fink 在 Mac OS X 上为这些工具提供了一个 lrzsz 包。

将其设为社区 wiki,因为在 Paul 先到那里后我会因为获得代表而感到难过...

【讨论】:

【参考方案6】:

这是我对这个问题的首选解决方案 [正如我在 duplicate question 上提出的那样]。在创建 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 抓取到同一个远程主机,ssh 不会喜欢更改密钥

未来的工作: 这仍然很笨拙。显然,可以通过适当地设置 ssh 密钥来处理身份验证问题,并且通过向 grab() 添加参数来允许指定远程目录更加容易

更困难的是解决其他负面因素。选择一个动态端口会很好,但据我所知,没有优雅的方法可以将该端口传递给远程主机上的 shell;据我所知,OpenSSH 不允许您在远程主机上设置任意环境变量,而 bash 不能从命令行参数中获取环境变量。即使您可以选择一个动态端口,也无法确保在没有先连接的情况下不会在远程主机上使用它。

【讨论】:

【参考方案7】:

在研究这个问题时,我发现了一个可以替代 openssh 客户端 zssh 的程序。

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

像魅力一样工作。

【讨论】:

哇,很棒的选择!注意:在 Mac 上,您还可以执行“sudo port install lrzsz”,而不是 Ctrl-Space(这是 Spotlight 的默认快捷方式),您可以按 Ctrl-Shift-2 (^@) 我试过时根本没用——得到“sz: command not found”。 它就像一个魅力。我用 lrzsz 代替。 sz &lt;filename&gt;发送文件到远程主机,rz在windows中接收选择的文件(或将文件拖到XShell终端发送文件到远程主机)。它真的救了我的命。【参考方案8】:

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

【讨论】:

【参考方案9】:

https://superuser.com/questions/259481/reverse-scp-over-ssh-connection

sftp server
get file.txt

显然,您还可以在 sftp 控制台中浏览 n 个内容,get 采用完整的文件路径。复制到您运行 sftp 的目录。

【讨论】:

以上是关于SSH - 一种无需打开单独的 SFTP 会话即可传输文件的方法?的主要内容,如果未能解决你的问题,请参考以下文章

sftp使用

单独的 SSH 和 SFTP [关闭]

如何使用 libssh 和 SFTP 在 C/C++ 中复制文件

使用 paramiko 防止 SFTP/SSH 会话超时

Xshell5下利用sftp上传下载传输文件

SecureCRT sftp上传文件报错:put: failed to upload xxx 拒绝访问