如何使用SSH远程写入文件


41

我可以将文件复制到远程Linux机器上,而不会出现任何问题

scp file user@host: /pathtowrite_file

但是,我很难从一台linux机器写入文件到另一台linux机器。这是我尝试的:

echo 'Some Text' > /remotefile.txt | ssh user@remotehost

我得到的通知是

stdin:不是tty

无论如何,远程计算机上的文件不会反映发送给“某些文本”的文本。

Answers:


70

您可以使用“ cat”命令来创建远程文件。

echo 'Some Text' | ssh user@remotehost -T "cat > /remotefile.txt"

-T禁用伪终端分配和阻止你获得的消息,

因为stdin不是终端,所以不会分配伪终端。


但是,我想写入远程计算机上的现有文件。
萨福2012年

2
“ cat> /remotefile.txt”将在远程计算机上运行,​​如果要附加到现有文件,则将“>”替换为“ >>”
Aragorn 2012年

@suffa:您是否要附加到现有文件?还是要覆盖文件,但如果该文件不存在则失败?或者是什么?
David Schwartz'3

@ David Schwartz-要么。我想覆盖一下,如果它没有退出会失败...但是,在这一点上,我只想追加一下。
萨福2012年

`echo'Some Text'| ssh user @ remotehost“ tee -a /remotefile.txt”`也对我有用。
Simply Seth 2014年

10

比其他答案短:

ssh user@remotehost "echo Some Text > /remotefile.txt"

3
真正; 这将起作用—如果OP真正想做的就是将一行文本写入远程文件。问题中的命令看起来像是概念验证测试。问题是,“将文件从一台Linux机器写入另一台机器。” 如果用户想在echo本地运行任意命令(或命令序列),而不仅仅是运行一个命令,那么您的答案将无济于事,而公认的答案就是做到这一点的方法。
斯科特

@Scott使用此方法也可以使用多个命令。像大多数Linux一样,ssh localhost "echo 'hi'; echo 'hello'; echo 'well, hello there!'
TMTOWTDI

帅哥,谢谢你的反对。我想这比实际解决我的观点容易吗?PS:您在上面的评论没有任何意义。
g33kz0r

1
好吧,您想要更多批评吗?(1)你为什么在说ssh localhost?那只是使水浑浊,没有使水更清澈。(2)通过在修改后的示例中未显示重定向,您提出了一个问题,即您是否知道如何对命令进行分组并将所有输出发送到一个文件。…(续)
斯科特

1
(续)…(3)通过关注短语“一行文本”,您已经错过了我的观点。我的观点是,OP可能想要做一些比将已知文本写入远程文件更复杂的事情-他可能想要运行本地命令并将输出发送到远程文件,如中所示。如果您可以调整您的答案以解决该一般情况,请这样做。command (localhost) > file (remotehost)
斯科特

6

也可以使用dd附加到文件中。如果无法在远程主机上进行输出重定向,则可能有点晦涩,但很有用。

cat ~/.ssh/id_rsa.pub | ssh user@remote.host 'dd of=.ssh/authorized_keys oflag=append conv=notrunc'

本示例将您的公共密钥附加到远程主机上的authorized_keys文件中。

(来源:http : //www.rsync.net/resources/howto/ssh_keys.html


3

这将在Mac上获取剪贴板的内容,并将其远程附加到文件末尾:

pbpaste | ssh root@my.machine.remote 'cat >> ~/.ssh/authorized_keys'

这使您可以将文件写入(追加)到远程主机上的文件末尾:

echo "Append string to file" | ssh root@my.machine.remote 'cat >> ~/.ssh/authorized_keys'

1

如果必须多次使用,使用此代码可能会更容易。使用“ sshpass”工具,ssh不会在每次调用脚本时提示您输入密码。(除非您需要对其保密,否则最好不要使用它)

有关sshpass的更多信息:https ://stackoverflow.com/questions/12202587/automatically-enter-ssh-password-with-script

#!/bin/bash

SCRIPT="echo 'nameserver 8.8.8.8' > /etc/resolv.conf"        

if [ "$#" -ne 1 ]; then
        echo "Wrong number of arguments. usage: prog dest_machine"
else
        sshpass -p "root" ssh -o StrictHostKeyChecking=no root@"$1" "${SCRIPT}"
fi

比什么更直观?这与g33kz0r的答案(差不多两年前)基本相同,外加一些不太明确的铃铛和口哨声。至少解释一下您添加的内容。
斯科特,

如果您的脚本调用了太多参数,则会发出一条错误消息,指出参数太少
G-Man说'Resstate

是的,几乎与您是对的一样。它添加的一件事是,它更易于使用(如果需要多次)。是的,错误消息不是很好,我会修复它。
sergeyrar

1

您可以简单地使用vior nanopico编辑器:

# Just replace "vi" with "nano" or "pico" if you want to use them.
vi remotefile.txt

但是,您随后必须Some Text自己在编辑器中写入它,因此此过程实际上不是批处理兼容的。


-1

创建如下脚本:

# !/bin/bash

read -p "Enter target server IP : " server
echo "Enter root password for $server : " ; read -s password

yum install sshpass -y

sshpass -p "$password" ssh -o strictHostKeyChecking=no root@$server echo "your text goes here" >> /remotefile.txt

我看到了低票-最有可能来自那些没有yum充分理由就不会使用新命令的人。这个答案说明了如何但不是为什么。(目前暂时取消
否决票
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.