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

Shell SSH-一种无需打开单独SFTP会话即可传输文件的方法?,shell,ftp,ssh,sftp,openssh,Shell,Ftp,Ssh,Sftp,Openssh,这不是一个真正的编程问题,但与许多程序员有关 假设我打开了一个到另一台计算机的SSH会话 远程:html avalys$ls welcome.msg index.html readme.txt 远程:html avalys$ 我是否可以在远程shell中键入任何命令,立即将当前目录中的一个文件(例如welcome.msg)传输到我的本地计算机,即 远程:html avalys$stransfer welcome.msg Fetching/home/avalys/html/welcome.msg至

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

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

远程:html avalys$ls
welcome.msg index.html readme.txt
远程:html avalys$

我是否可以在远程shell中键入任何命令,立即将当前目录中的一个文件(例如welcome.msg)传输到我的本地计算机,即

远程:html avalys$stransfer welcome.msg
Fetching/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”)和我想要传输的文件,并使其正常工作,那就太好了。

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


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

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

ssh -Rport:127.0.0.1:22 user@host
对于
scp
back


使用
scpuser@host:port
访问它。

如果你想修补一些东西(不应该修补的东西),看看你可以编写一个名为stransfer的bash脚本,它将使用一个filename参数,然后它会在scp命令中插入文件名,假设服务器和服务器上文件的路径不变

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


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

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

在Mac OS X上为这些工具提供
lrzsz


让这成为一个社区维基,因为在Paul第一个到达那里之后,我会为获得代表而感到难过…

这是我对这个问题的首选解决方案[正如我在一份问卷中所给出的那样]。在创建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>
localhost%grabfromremoteuser@remotehost
密码:
远程主机%grab somefile1 somefile2*.txt
密码:
积极因素:

  • 除了OpenSSH之外,它在任何主机上都不需要特殊软件
  • 当本地主机位于NAT路由器后面时,它工作
  • 它可以实现为一对两个单行bash函数
负片:

  • 它使用固定端口号,因此:
    • 无法使用到远程主机的多个连接
    • 可能与远程主机上使用该端口的进程冲突
  • 它需要本地主机接受ssh连接
  • 启动会话时需要一个特殊命令
  • 它不会隐式处理对本地主机的身份验证
  • 它不允许在localhost上指定目标目录
  • 如果从多个本地主机抓取到同一个远程主机,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
sudo-apt-get-install-zssh
zsshuser@remote
sudo-apt-get-install-zssh
sz file.name
+
rz

工作起来很有魅力。

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


显然,您还可以在sftp控制台中浏览n stuff,并且
get
采用完整的文件路径。复制到运行
sftp

的目录。我知道了,您正在寻找类似Fido时代的旧sz命令的内容。老兄,这让我想起了。如果你只是想避免键入scp的第二个参数,你只是想问一个别名。好主意。在涉及的每台机器上维护一个.ssh/config文件将为您节省更多的打字时间。哇,这是一个很好的选择!
sftp server
get file.txt