14

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

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

远程:html avalys$ ls
welcome.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
remote:html avalys$

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

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

4

9 回答 9

8

您可以设置这样的反向传输连接 w/

ssh -Rport:127.0.0.1:22 user@host

回来scp

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

于 2009-01-13T20:00:20.287 回答
5

在对此进行研究时,我发现了一个可以替代 openssh 客户端 zssh 的程序。

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

奇迹般有效。

于 2012-04-23T17:03:52.027 回答
2

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

于 2009-02-09T18:16:12.683 回答
2

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

于 2012-08-24T15:49:31.453 回答
1

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

于 2009-01-13T20:05:54.690 回答
1

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

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

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

于 2009-01-13T20:19:20.373 回答
1

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

Finklrzsz在 Mac OS X 上为这些工具提供了一个软件包。

把它变成一个社区维基,因为在保罗第一次到达那里之后我会因为获得代表而感到难过......

于 2009-01-14T00:55:10.880 回答
0

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

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

于 2009-01-13T19:56:10.903 回答
0

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

sftp server
get file.txt

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

于 2014-06-05T00:45:29.663 回答