通过活动 SSH 会话下载文件

Oli*_*Oli 96 ssh

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

如果您难以理解我的意思,请想象您想从/root/或下载某些内容/var/log/auth.log。Root 登录被禁用(因为我们不是白痴)。你怎么得到那个文件?将它复制到不受保护的地方然后移动它?这很笨拙。也有远程路径复杂或临时的情况,或者甚至不是路径,因为我希望远程命令的输出存储在本地。远程存储,然后复制?笨拙!

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

$oli@remote: cp /root/cheesecake /local/
Run Code Online (Sandbox Code Playgroud)

它只出现在我的本地cwd. 双向访问也不是坏事。


我问这个问题已经八年了,我们已经看到了一系列真正的笨拙,但它仍然是一个我偶尔仍然在为之奋斗的问题。

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

Spa*_*apS 38

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

sudo apt-get install zssh

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

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

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

[enter]~[ctrl]-Z
Run Code Online (Sandbox Code Playgroud)

哪个将后台ssh,然后只是 scp $!:/whatever/whatever .'

文件传输fg完毕后,即可恢复 ssh。

如果您不使用 ssh 密钥,您仍然可以使用添加到最新 OpenSSH 版本中的“ControlMaster”和“ControlPath”选项,但这会变得棘手,请检查 man ssh_config


Gil*_*il' 25

假设您在桌面上运行 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进入一个命令行,您可以在其中创建或删除转发。

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

小智 11

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

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

    ControlMaster auto
    ControlPath ~/.ssh/socket-%r@%h:%p
    
    Run Code Online (Sandbox Code Playgroud)

    现在如果你有一个到 machineX 的 ssh 连接打开,你不需要密码来打开另一个。

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

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

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

    alias grab=~/.grab.sh
    
    Run Code Online (Sandbox Code Playgroud)

就这样,大功告成。现在,如果您已登录machineX:/some/directory,只需启动一个新终端并键入

grab machineX filename
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

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

scp myfile machineA:
Run Code Online (Sandbox Code Playgroud)

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

scp myfile machineA:/newdir/newname
Run Code Online (Sandbox Code Playgroud)

myfile一台 MachineB复制到/newdir/newnamemachineA 上。这假设用户 ID/密码相同。

scp MachineA:/path/to/my/otherfile . 
Run Code Online (Sandbox Code Playgroud)

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

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

scp myfile user@MachineA: 获取文件。

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

关于SCP的注意事项:

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

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