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

我想从活动的SSH会话中下载文件。 在许多情况下,我可能只使用SFTP, scprsync等,但有时我在远程服务器上提升了权限,我无法使用这些方法。

如果你正在努力理解我的意思,想象你想从/root//var/log/auth.log下载一些东西。 root登录被禁用(因为我们不是白痴)。 你怎么得到那个文件? 把它复制到受保护较少的地方,然后移动它? 这很笨重。 还有一些情况是远程路径是复杂的或临时的,或者甚至不是路径,因为我希望本地存储远程命令的输出。 远程存储,然后复制? 闷响!

有几种更笨重的方法可以实现这些版本,但在理想的世界中,我会使用现有的SSH会话作为管道,从远程服务器获得类似于本地写入访问的东西。 喜欢的东西(这只是艺术家的印象):

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

它只出现在我当地的cwd 。 双向访问并不是一件坏事。


自从我提出这个问题已经过去了八年,我们已经看到了一系列真正的笨蛋,但这仍然是一个我偶尔会遇到的问题。

我把这个问题重构成了更理想化的东西。 我完全明白,目前可能没有一个完美的答案。 所有过去和未来的努力都会受到赞赏。

您可能想要查看zssh ,它在Universe中可用,因此可用

sudo apt-get install zssh

你需要在你的ubuntu服务器和你的客户端上,但基本上当用zssh登录时,你只需点击’ctrl- @’它就会调出“文件传输模式”,它允许你将文件从管道传回你的客户端计算机,或从客户端上传到服务器。

但是,您不必重新validation或打开scp的新窗口。

如果你正在使用ssh密钥和ssh代理,你可以很容易地做到:

 [enter]~[ctrl]-Z 

哪个会背景ssh,然后只是scp $!:/whatever/whatever .'

传输文件后, fg返回ssh。

如果你没有使用ssh密钥,你仍然可以使用添加到最近的OpenSSh版本的“ControlMaster”和“ControlPath”选项,但是这很棘手,请检查man ssh_config

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

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

Ssh转义序列以~开头; 波浪线仅在换行后才能识别。 ~ Ctrl+Z将ssh放入后台。 ~C进入命令行,您可以在其中创建或删除转发。

我想出了一种用标准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
    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

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

 scp myfile machineA: 

myfile上的myfile复制到machineA上的MachineA主目录。 这假设用户ID /密码相同。

 scp myfile machineA:/newdir/newname 

myfile一个MachineB复制到machineA上的/newdir/newname 。 这假设用户ID /密码相同。

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

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

如果用户标识/密码不相同,则使用:

scp myfile user@MachineA:获取文件。

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

关于SCP的说明:

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

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

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

在此处输入图像描述

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

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

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

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

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

当您处于远程会话(或Ctrl-Alt-U)时, konsole通过“编辑 – > ZModem上传”菜单具有该function。

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

由于您是从桌面连接,我想您可以打开第二个终端。

这就是我经常这样做的方式:

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

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

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

令人惊讶的是,我没有在这里看到任何好老的午夜指挥官 。 在我看来,它可能是具有电源function的shell的最通用和最有用的文件管理器,这是该案例的“必备”工具之一,它也允许您通过SSH,FTP,SFTP连接,同时在第二个面板,您可以打开任何其他(您的本地)文件系统,因此可以自由地处理文件。

您所需要的只是: apt-get install mc (来自宇宙)

之后,运行mc,打开左侧或右侧面板的菜单,选择shell连接,输入username @ remote-ip,密码 – 实际上,就是它..复制(这里:下载)文件/文件夹从一台机器到另一台机器F5,按F6移动,依此类推,按照下面的按钮。 对于旧的MS用户:就像NC for DOS一样

伙计们,过度思考这个问题。 我也在寻找所有深刻,黑暗,复杂的答案。 事实certificate,你可以直接从海豚身上做到这一点。 鱼://用户名@服务器:端口