手動で入力したように、インラインSSHを使用してコマンドを実行しますが、ローカルコンピュータに直接出力するにはどうすればよいですか?

手動で入力したように、インラインSSHを使用してコマンドを実行しますが、ローカルコンピュータに直接出力するにはどうすればよいですか?

私は完全に制御できないリモートサーバーにアクセスでき、自動化スクリプトがそのサーバー上でローカルにタスクを実行することを好みます。 SSHを使用してインラインで実行されるすべてのコマンドが同じように動作するわけではありません。クローンジョブで実行される例:

ssh [email protected] "mysqldump -u dbuser -p'pass$word' dbname > backup.sql"

上記の内容(およびさまざまなバリエーション)はを返しますmysqldump: Got error: 1045: Access denied for user 'dbuser'@'localhost' (using password: YES) when trying to connect。ただし、sshサーバーでパスワードが正しいことを確認してから手動で実行すると、mysqldump -u dbuser -p'pass$word' dbname > backup.sqlすべてがうまく機能します。

別の例は、次のようなものを実行することです。

ssh [email protected] history > history.txt 

上記の出力は空ですが、ssh別のコンピュータに移動して手動で実行すると、history > history.txt出力が期待どおりに表示されます。

次のタスクを実行すると、すべてが期待どおりに機能します。

ssh [email protected] ls > ls.txt 

mysqldump説明されているローカルファイルを省略して使用して-p'pass$word'例を解決できることを知っています。.my.cnfここhistory専門的な答えを見つけることができますここ

ただし、インラインで実行して出力をローカルにリダイレクトすると、引用符で囲まれても、まだ期待どおりに機能しない他のコマンドが発生します。これは、シェルがアクセス方法に応じて他の変数が追加されたものを読み取るのと同じです。

手動で入力したように、インラインSSHを使用してコマンドを実行しますが、ローカルコンピュータに直接出力するにはどうすればよいですか?

ベストアンサー1

問題はあなたの見積もりです。

$ word='phrase'
$ echo "pass$word"
passphrase
$ echo "'pass$word'"
'passphrase'
$ echo "'pass\$word'"
'pass$word'

強い引用符は、弱い引用符内の変数を「保護」しません。なぜなら魔法の属性を失うことになるからです。

簡単な解決策はドル記号を避けることです。これは没落する可能性があります。

$ ssh [email protected] "mysqldump -u dbuser -p'pass\$word' dbname > backup.sql"

別の方法は、実際にパスワードを変数に入れることです。

$ password='pass$word' ssh [email protected] "mysqldump -u dbuser -p '$password' dbname > backup.sql"

第三に、バックアップをlocalhostに転送するには、SSHトンネルを使用します。

$ ssh -L 3306:localhost:3306 sleep 60 &
$ mysqldump -u dbuser -p 'pass$word' -h localhost -P 3306 dbname > backup.sql

また、あなたの質問には出力をローカルコンピュータにリダイレクトすることが含まれていますが、コマンドはそうしません。

$ ssh user@host "echo hello > output" # creates output on remote host
$ ssh user@host "echo hello" > output # creates output on local host

おすすめ記事