我的服务器上的同一文件夹中有两个图像(image1.png 和 image2.png),我想运行一个命令将 image2.png 覆盖为 image1.png。我更喜欢覆盖图像而不是删除它,然后用另一张图像替换它。如何通过 ssh 命令行实现这一点?
答案1
ssh host "cd path/to/directory && cp image1.png image2.png"
比失败的情况&&
更安全,例如由于拼写错误:在这种情况下,不会执行而不是可能复制错误的文件。;
cd
cp
答案2
没有sudo
该命令ssh server "cd path/to/directory && cp image1.png image2.png"
就没有特权权限chmod
。
但是使用sudo
它,但在之后运行ssh
,它永远不会在远程服务器上获取密码输入,因此解决方案是使用-S
并通过管道传递密码,sudo
如下所示:
ssh server " cd path/to/directory && echo sudo_password | sudo -S chmod 600 image2.png && cp image1.png image2.png"
编辑:
不过,@terdon是如何标记的,我们这里不需要更改权限,而是使用sudo cp
,所以得出:
ssh server " cd path/to/directory && echo sudo_password | sudo -S cp image1.png image2.png"
或(如果您认为您的密码可以被读取)
ssh server -t " cd path/to/directory && sudo cp image1.png image2.png"
更新:@terdon 也警告了我,我添加了这一点,因为我认为强调并强调这种可能的实现很重要:
我真的会删除这个使用 -S 的建议,它不是必需的,而且非常危险(请参阅@mikserv 的评论和我的答案)。这也是毫无意义的。您提到的唯一“优点”是能够进行管道传输,这是一种边缘情况,在大多数情况下,您可以直接在服务器上进行管道传输。您还可以按照建议使用 sshpass 或设置无密码 sudo。各种不将服务器密码存储为明文的方法。 – 特登
一方面,这有利于自动化,无需获取sudo
密码提示,并且要拥有完全自动化的代码/脚本,您可以添加sshpass -p password ssh...
.
但是,在服务器上,其他人可以轻松读取ssh
会话期间以开放文本形式提供的 sudo 密码,从安全角度来看,不建议这样做。所以,要拥有sudo
并ssh
安全使用ssh -t
ssh -t server "cd path/to/directory && sudo chmod 600 image2.png && cp image1.png image2.png"
尽管如此,例如不可能-t
进行管道传输,但可以使用 -S 和回显密码,例如ssh "sudo command"| command
ssh -t server "cd path/to/directory && sudo"|grep "text"
ssh server 'echo password | sudo -S ls -l'| grep 'a'
答案3
为了通过 ssh 连接到服务器并运行特定命令,您只需要 ssh “命令”
在您的情况下,您想要复制一个文件(默认情况下会覆盖),因此您需要该cp
命令。它的工作原理就像cp /path/to/original /path/to/copy
。现在,您在评论中说尝试这样做会给您带来权限被拒绝的错误。这意味着您需要以 root 身份运行该命令。这是使用sudo
, so完成的sudo cp /path/to/original /path/to/copy
。
下一个问题是 ssh 运行一个没有 tty 的非交互式 shell,因此sudo
无法要求输入密码。-t
为此,您需要使用 ssh 。因此,将所有这些放在一起,您可以执行以下操作:
ssh -t user@server sudo cp /path/to/image2.png /path/to/image1.png
做不是曾经sudo
按照另一个答案的建议回显您的密码。这是非常危险的,因为它会让系统上连接的任何用户都可以看到它,并且它也会以纯文本形式保存在您的历史文件中。这意味着我需要做的就是grep sudo ~youruser/.bash_history
拥有您的密码和对服务器的完全访问权限。因此,任何获得服务器访问权限的攻击者现在都可以做任何他们想做的事情。