我想从活动的 SSH 会话下载文件。在许多情况下,我可能会只使用SFTP, scp,rsync等人,但也有在那里我有一个办法,我不能使用这些方法在远程服务器上提升的权限倍。
如果您难以理解我的意思,请想象您想从/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。
~C Enter -R 22042:localhost:22 Enter以创建从服务器到桌面的反向端口转发(22042 可以是 1024 和 65534 之间未使用的任何端口号)。scp -P 22042 foo localhost:将foo服务器上你当前目录下的文件复制到你家的桌面上。~ Ctrl+将文件移动到桌面上的当前目录Z mv ~/foo . Enter fg Enter。SSH 转义序列以~;开头 波浪号只能在换行后识别。~ Ctrl+Z将 ssh 置于后台。~C进入一个命令行,您可以在其中创建或删除转发。
小智 11
我想出了一种使用标准 ssh 执行此操作的方法。这是一个复制当前 ssh 连接的脚本,在远程机器上找到您的工作目录并将您指定的文件复制回本地机器。它需要 2 个非常小的脚本(1 个远程脚本,1 个本地脚本)和 ssh 配置中的 2 行。步骤如下:
将这两行添加到您的~/.ssh/config:
ControlMaster auto
ControlPath ~/.ssh/socket-%r@%h:%p
Run Code Online (Sandbox Code Playgroud)
现在如果你有一个到 machineX 的 ssh 连接打开,你不需要密码来打开另一个。
在名为的远程机器上制作一个 1 行脚本 ~/.grabCat.sh
\#!/bin/bash<br>
cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
Run Code Online (Sandbox Code Playgroud)在本地机器上创建一个名为 ~/.grab.sh 的脚本
\#!/bin/bash
[ -n "$3" ] && dir="$3" || dir="."
ssh "$1" ".grabCat.sh $2" > "$dir/$2"
Run Code Online (Sandbox Code Playgroud)并在(~/.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 系统之间复制时不会有问题,它们都使用相同的行尾约定。