SSHを使用してファイルにリモートで書き込む方法


41

問題なくリモートLinuxマシンにファイルをコピーできます

scp file user@host: /pathtowrite_file

ただし、あるLinuxマシンから別のLinuxマシンにファイルを書き込むのは困難です。ここに私が試みたものがあります:

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

私が得る通知は

stdin:ttyではありません

とにかく、リモートマシン上のファイルは、「Some Text」で送信されたテキストを反映しません。

回答:


70

「cat」コマンドを使用して、リモートファイルを作成できます。

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

-T無効は割り当て端末を擬似し、メッセージを得ることからあなたを停止し、

stdinは端末ではないため、疑似端末は割り当てられません。


しかし、リモートマシン上の既存のファイルに書き込みたいです。
-suffa

2
「猫> /remotefile.txt」リモートマシン上で実行され、あなたが交換する既存のファイルに追加したい場合は、「>」、「>>」によって
アラゴルン

@suffa:既存のファイルに追加しようとしていますか?または、ファイルを上書きしますが、まだ存在しない場合は失敗しますか?または何?
デビッドシュワルツ

@ David Schwartz-どちらか。上書きし、終了しない場合は失敗します...しかし、この時点で追加するだけです。
-suffa

`echo 'Some Text' | ssh user @ remotehost" tee -a /remotefile.txt "`も同様に機能しました。
単にセス

10

他の答えよりも少し短い:

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

3
本当; これは機能します。リモートファイルに1行のテキストを書き込むだけで、OPがやりたいことは本当にすべてです。質問のコマンドは、概念実証テストのように見えます。質問は、「あるLinuxマシンから別のLinuxマシンへファイルに書き込む」と言っています。ユーザーがechoローカルではなく、任意のコマンド(または一連のコマンド)をローカルで実行したい場合、答えは役に立たず、受け入れられた答えがそれを行う方法です。
スコット

@Scottこのアプローチを使用すると、複数のコマンドも可能です。Linuxのほとんどのものと同様に、TMTOWTDI: ssh localhost "echo 'hi'; echo 'hello'; echo 'well, hello there!'
g33kz0r

かっこいい、下票ありがとう。実際に自分の主張に取り組むよりも簡単だと思いますか?PSあなたの上記のコメントは意味がありません。
g33kz0r

1
OK、もっと批判したいですか?(1)なぜあなたは世界で言っているのssh localhostですか?それは水を濁らせているだけであり、水を透明にするものではありません。(2)変更した例にリダイレクトを表示しないことにより、コマンドをグループ化し、すべての出力を1つのファイルに送信する方法を知っているかどうかという疑問が生じます。…(続き)
スコット

1
(続き)…(3)「1行のテキスト」というフレーズに注目して、私の論点を見逃しました。私のポイントは、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の回答(ほぼ2年前から)と本質的に同じですが、特に明確ではない鐘とwhiがいくつかあります。少なくとも、追加したものは説明してください。
スコット

スクリプトが多すぎる引数で呼び出された場合、引数が少なすぎるというエラーメッセージが発行されます。
G-マンは「元に戻すモニカ言う

はい、それはあなたが正しいとほとんど同じです。それが追加する1つのことは、それがもう少し使いやすいということです(複数回必要な場合)。はい、エラーメッセージは良くありません。修正します。
セルゲイラー

1

単にvior nanoまたはpicoエディタを使用できます:

# 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、非常に正当な理由がない限り、新しいコマンドを使用しない人からです。この答えは、方法ではなく、理由を示しています。(とりあえずdownvoteをキャンセルします-これを編集して、より多くのコンテキストを提供してください)
-SDsolar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.