ファイルのコピーと既存のファイルの上書き

ファイルのコピーと既存のファイルの上書き

私のサーバーの同じフォルダに2つのイメージ(image1.pngとimage2.png)があり、image2.pngをimage1.pngで上書きするコマンドを実行したいと思います。画像を削除して他の画像に置き換えるよりも画像を上書きすることを好みます。 SSHコマンドラインを使用してどのようにこれを達成できますか?

答え1

ssh host "cd path/to/directory && cp image1.png image2.png"

たとえば、タイプミスのために失敗した場合よりも安全&&です。この場合、誤ったファイルをコピーする代わりに実行は行われません。;cdcp

答え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"| commandssh -t server "cd path/to/directory && sudo"|grep "text"ssh server 'echo password | sudo -S ls -l'| grep 'a'

答え3

SSHを介してサーバーに接続して特定のコマンドを実行するには、SSH "command"のみを使用できます。

あなたの場合、ファイル(デフォルトで上書きされている)をコピーしようとしているので、適切なcpコマンドが必要です。それは次のように動作しますcp /path/to/original /path/to/copy。今、コメントでこれを試してみると、権限拒否エラーが発生すると言われました。これは、rootとしてコマンドを実行する必要があることを意味します。これはをsudo使用して行われますsudo cp /path/to/original /path/to/copy

次の問題は、sshがttyなしで非対話型シェルを実行するため、sudoパスワードを要求できないことです。-tこれにはsshを使用する必要があります。したがって、これらすべてをまとめると、次のことができます。

ssh -t user@server sudo cp /path/to/image2.png /path/to/image1.png

するいいえsudo提案された他の答えに従ってパスワードをエコーするために使用されます。これはシステムに接続されているすべてのユーザーに表示され、履歴ファイルにプレーンテキストとして保存されるため、非常に危険です。つまり、私がしなければならないことは、grep sudo ~youruser/.bash_historyあなたのパスワードとサーバーへのフルアクセス権が必要なことです。したがって、サーバーにアクセスできる攻撃者は、今や望むことは何でもできます。

関連情報