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

时间:2009-01-13 19:53:03

标签: shell ftp ssh sftp openssh

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

假设我已经打开了与另一台计算机的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”)和我想要转移的文件,并且让它正常工作,那就太好了。

9 个答案:

答案 0 :(得分:7)

您可以使用ssh -Rport:127.0.0.1:22 user@host for scp back.

Use scp user@host:port设置此类反向传输连接来访问它。

答案 1 :(得分:5)

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

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

像魅力一样。

答案 2 :(得分:2)

这是我对这个问题的首选解决方案[正如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上指定目标目录
  • 如果您从多个localhosts抓取到同一个远程主机,则ssh不会更改密钥

未来的工作: 这仍然是非常kludgy。显然,可以通过适当地设置ssh键来处理身份验证问题,通过向grab()

添加参数来更容易地允许指定远程目录。

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:1)

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

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

将此作为一个社区维基,因为在保罗首先到达那里之后,我会感到难以获得代表......

答案 7 :(得分:0)

在学校,如果我将文件从一个Linux系统转移到另一个系统,我通常使用ssh进行远程操作,然后使用scp将文件从远程系统传输回我的计算机。不确定这是否是您正在寻找的,或者在您的情况下是否适用,但这通常是我必须打开另一个终端窗口的方式。

只是为了澄清你是否不熟悉scp,你仍然需要指定你想把文件放在你的计算机上的位置,但对我而言,这通常比文件的位置更容易记住在远程计算机上。以下链接可能会有所帮助:http://www.computerhope.com/unix/scp.htm

答案 8 :(得分:0)

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

sftp server
get file.txt

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