通过活动的SSH会话下载文件


86

我想从活动的SSH会话下载文件。在许多情况下,我可能只使用SFTP, scprsync等人,但也有在那里我有一个办法,我不能使用这些方法提高远程服务器上权限倍。

如果您想了解我的意思,请想象您要从/root/或下载某些内容/var/log/auth.log。根登录已禁用(因为我们不是白痴)。您如何获得该文件?将其复制到受保护程度较小的位置,然后再将其移动?这很笨重。在某些情况下,远程路径是复杂的或临时的,甚至不是路径,因为我希望将远程命令的输出存储在本地。远程存储,然后复制?笨拙!

还有几种笨拙的方法来实现这些版本,但在理想情况下,使用现有的SSH会话作为管道,我将具有类似于从远程服务器进行本地写访问的功能。诸如此类(这只是艺术家的印象):

$oli@remote: cp /root/cheesecake /local/

而且它只是出现在我的本地计算机中cwd。双向访问也不是一件坏事。


自问这个问题已经八年了,我们看到了真正的旧问题,但这仍然是我偶尔遇到的问题。

我已经将问题重构为更加理想化的东西。我完全理解,目前可能还没有一个完美的答案。感谢所有过去和将来为实现我的理想所做的努力。


1
有趣的问题!它确实显示了人们对明智做法的想法是如何被他们所使用的工具所塑造的。 zssh可能最接近您可能记得的类似zmodem的工作流程。
2010年

1
我真的很惊讶,即使在回答了8个问题之后,实际上也没有任何方法可以做到
endolith 2013年

Answers:


34

您可能想检查一下zssh,它在Universe中可用,因此可以在

sudo apt-get install zssh

您在ubuntu服务器和客户端上都需要它,但是基本上,当使用zssh登录时,您只需按“ ctrl- @”,它就会弹出“文件传输模式”,该模式允许您通过管道将文件发送回您的客户端计算机,或将其从客户端上传到服务器。

但是,您无需重新验证或打开新窗口即​​可进行scp。

如果您使用的是ssh密钥和ssh代理,则可以很容易地执行以下操作:

[enter]~[ctrl]-Z

这将背景ssh,然后 scp $!:/whatever/whatever .'

传输文件后,fg要恢复ssh。

如果您不使用ssh键,则仍可以使用添加到最新OpenSSh版本中的“ ControlMaster”和“ ControlPath”选项,但这会很棘手,请检查man ssh_config


24

假设您正在桌面上运行ssh服务器(有很多解决方法,但是我认为它们都增加了复杂性,并且可能存在安全问题),则可以设置反向ssh隧道。请参阅SSH轻松将文件复制到本地系统。unix.SE结束

  • 键入Enter ~C Enter -R 22042:localhost:22 Enter以创建从服务器到桌面的反向端口转发(22042可以是1024到65534之间的任何未使用的端口号)。
  • 然后,scp -P 22042 foo localhost:foo服务器上当前目录中的文件复制到桌面上的家中。
  • 现在,通过输入Enter ~ Ctrl+ 将文件移动到桌面上的当前目录Z mv ~/foo . Enter fg Enter

ssh转义序列始于~;仅在换行符之后才识别代字号。~ Ctrl+Z将ssh置于后台。~C输入一个命令行,您可以在其中创建或删除转发。


1
使用2层加密和压缩有点矫kill过正,这就是为什么我建议使用rsh或ftp作为“反向链接”。
2010年

2
@JanC:这需要更多设置:您必须安装rsh或ftp服务器,并确保其配置安全。即使在上网本上,加密的开销也很小。
吉尔斯(Gilles)2010年

默认情况下也未安装ssh服务器。;)
JanC

@JanC:ssh的另一个优点是,如果启用了代理转发,则无需键入密码即可进行复制。工作流效率超过计算效率。
吉尔斯

当然,您也可以使用(某些)其他服务来做类似的事情。无论如何,有多种类似的解决方案,都涉及建立回传的隧道连接和一个额外的守护程序……;)
2010年

10

我想出了一种使用标准ssh进行此操作的方法。它是一个脚本,用于复制当前的ssh连接,在远程计算机上找到您的工作目录,然后将您指定的文件复制回本地计算机。它在ssh配置中需要2个非常小的脚本(1个远程脚本,1个本地脚本)和2行。步骤如下:

  1. 将这两行添加到您的~/.ssh/config

    ControlMaster auto
    ControlPath ~/.ssh/socket-%r@%h:%p
    

    现在,如果您已打开与machineX的ssh连接,则无需密码即可打开另一个。

  2. 在名为的远程计算机上制作一行脚本 ~/.grabCat.sh

    \#!/bin/bash<br>
    cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
    
  3. 在本地计算机上创建一个名为〜/ .grab.sh的脚本

    \#!/bin/bash
    [ -n "$3" ] && dir="$3" || dir="."
    ssh "$1" ".grabCat.sh $2" > "$dir/$2"
    
  4. 并在(~/.bashrc或任何地方)为grab.sh命名:

    alias grab=~/.grab.sh
    

就是这样,全部完成。现在,如果您已登录machineX:/some/directory,只需启动一个新终端并输入

grab machineX filename

这会将文件放在本地计算机上的当前工作目录中。您可以将其他位置指定为“抓取”的第三个参数。

注意:显然,两个脚本都必须是“可执行的”,即chmod u+x filename


有趣的是,您能否解释一下这是如何工作的?您是否可以扩展它以支持“放入”文件以及抓取它们?
彼得·吉布森

5

如果您的客户端计算机(您所在的计算机)称为machineA,而您当前通过SSH登录的计算机称为计算机B。MachineA,则本地计算机必须运行SSHD并且端口22已打开。然后:

scp myfile machineA:

myfile在MachineB上复制到我在MachineA上的MachineA主目录。假设用户名/密码相同。

scp myfile machineA:/newdir/newname

myfile一个MachineB 复制到/newdir/newnamemachineA上。假设用户名/密码相同。

scp MachineA:/path/to/my/otherfile . 

otherfile从MachineA上我的MachineA目录中获取一个副本,并将其放入我在MachineB机器上的当前工作目录中(以标准UNIX方式由“点”(。)字符指定)。假设用户名/密码相同。

如果用户名/密码不同,请使用:

scp myfile user@MachineA: 获取文件。

scp user@MachineA:/path/to/my/otherfile . 放置文件

关于SCP的注意事项:

就像该cp命令一样,scp具有-p选项可将原始文件的权限设置传播到副本(否则,副本将使用新文件的常规设置进行复制),以及-r选项可将整个目录树复制到一个副本中。命令。

scp在两台计算机之间创建一个完全透明的加密数据通道,因此二进制数据(例如图像或可执行程序)可以正确保留。这也意味着scp不能像在“ ascii”模式下使用ftp那样在不同类型的操作系统之间执行自动的行尾终止转换。在所有都使用相同的行尾约定的Unix系统之间进行复制时,这不会成为问题。


2

如果通过ssh访问服务器,则也可以通过sftp进行连接。保持Filezilla客户端(GUI)方便并粘贴您当前所在的路径

在此处输入图片说明


2
这将受益于更多细节,包括如何使用FileZilla连接到SSH服务器(这并不明显)。除了说明文字外,屏幕截图也可能有所帮助。
伊利亚·卡根

2

如果文件足够小,则可以使用base64对其进行编码,然后在本地对其进行解码:

remote.example.net $ base64 <myfile
 (复制输出)
local.example.net $ base64 -d> myfile
 (复制输出)
Ctrl +D

我从(https://unix.stackexchange.com/a/2869/194134)得到这个(并经过测试)的原始答案


这和什么有什么关系?您无需编码文件即可使用scp等文件对它们进行txfr。
HörmannHH18

1

它不是通过活动的SSH连接进行的,但是scp使用与ssh相同的机制和权限来复制文件。


4
我知道scp,但这是一个非常脱节的工作流程。如果我在给定的远程目录中工作,则需要获取远程路径,断开连接(或生成另一个shell),执行scsc写入路径,然后重新连接。我正在寻找类似于书写的内容,get file并且它神奇地重新出现在本地计算机上。如果必须通过通过SSH隧道传输的某些服务来执行此操作,则应这样做。但是它应该是会话绑定的。
奥利(Oli)

另外,它已被sftp取代(请参见我的回答)
Olivier Lalonde 2010年

@Oli-由于事务的两端都是* nix框,因此它们都可能sshd正在运行,因此您应该能够scp在服务器的命令行上使用将文件扔回客户端。周围只有那么多魔术。有时我们仍然必须按一下按钮。FileZilla解决方案也很方便。
zerobandwidth

1

对于默认的ssh会话,这是不可能的,但是您可以使用脚本而不是ssh,该脚本会在本地系统上启动类似简单ftp或rsh服务器的操作,并使用必要的选项运行ssh来设置返回桌面的隧道用于连接到该服务器。


或者可能只是SCP / rsync的...
HörmannHH

1

konsole 在远程会话(或Ctrl-Alt-U)中时,通过“编辑-> ZModem上传”菜单具有此功能。

请注意:lrzsz必须先安装软件包。对我来说,看起来只适用于上传ASCII文件。


0

由于您是从台式机连接的,所以我想您可以打开第二个终端。

我经常这样做:

  • 从第一个终端(运行ssh会话的终端),使用realpath myfilereadlink -f myfile(旧的Ubuntu版本未预安装realpath)获取需要获取的文件的完整路径,然后将其复制。
  • 从我使用scpsftp获取文件的第二个终端粘贴到我之前获得的完整路径。例如:scp user@host:/etc/some/file ./

这是非常基本的,但是它也很容易记住,不需要任何额外的程序包。

从第一个终端获取完整路径,然后粘贴到第二个终端


问题中提出的“不允许获取根文件并不允许直接通过root登录”问题无济于事。
奥利(Oli)

0

令人惊讶的是,我在这里看不到任何好的老午夜指挥官。在我看来,它可能是具有强大功能的Shell的最通用,最有用的文件管理器,是该案例的“必备”工具之一,它还允许您同时通过SSH,FTP,SFTP进行连接在第二个面板中,您可以打开任何其他(本地)文件系统,从而自由使用文件。

您需要做的就是:apt-get install mc(来自Universe)

之后,运行mc,打开左侧或右侧面板的菜单,选择shell连接,输入username @ remote-ip,然后输入密码-实际上就是这样。 F5,按F6移动,依此类推,如下所示。对于旧的MS用户:就像在DOS的NC中一样


-2

各位,请多想一下。我也在寻找所有深层,黑暗,复杂的答案。事实证明,您可以直接从海豚罐中直接进行此操作。鱼://用户名@服务器:端口


我不明白
Pierre.Vriens

我认为您不了解我的用例。我处于活动的SSH命令行会话中,想从[潜在特权,即无法通过SFTP使用]位置将文件发送回本地计算机。它可能根本不是文件,可能是命令输出。我正在寻找一种无需创建中间文件和启动新的SFTP / SCP / etc会话即可将其传回的方法。
奥利(Oli)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.