通过活动的SSH会话下载文件
我想从活动的SSH会话中下载文件。 在许多情况下,我可能只使用SFTP, scp
, rsync
等,但有时我在远程服务器上提升了权限,我无法使用这些方法。
如果你正在努力理解我的意思,想象你想从/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 + Zmv ~/foo .
将文件移动到桌面上的当前目录中mv ~/foo .
输入fg
Enter 。
Ssh转义序列以~
开头; 波浪线仅在换行后才能识别。 ~ Ctrl+Z
将ssh放入后台。 ~C
进入命令行,您可以在其中创建或删除转发。
我想出了一种用标准ssh做到这一点的方法。 它是一个复制当前ssh连接的脚本,在远程计算机上找到您的工作目录,并将您指定的文件复制回本地计算机。 它在ssh配置中需要2个非常小的脚本(1个远程,1个本地)和2个行。 步骤如下:
-
将这两行添加到
~/.ssh/config
:ControlMaster auto ControlPath ~/.ssh/socket-%r@%h:%p
现在,如果你有一个与machineX打开的ssh连接,你将不需要密码来打开另一个。
-
在名为
~/.grabCat.sh
的远程计算机上创建一行脚本\#!/bin/bash
cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1 -
在名为〜/ .grab.sh的本地计算机上创建一个脚本
\#!/bin/bash [ -n "$3" ] && dir="$3" || dir="." ssh "$1" ".grabCat.sh $2" > "$dir/$2"
-
并在(
~/.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 myfile
或readlink -f myfile
(较旧的Ubuntu版本不预安装realpath
)并复制它。 - 从第二个终端我使用
scp
或sftp
来获取文件,粘贴我之前获得的完整路径。 例如: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,你可以直接从海豚身上做到这一点。 鱼://用户名@服务器:端口