1

次のような単一のコマンドが必要です。

  • 設定した公開鍵を使用して、ユーザーfooとしてサーバーにsshします
  • /etc/mysql/debian.cnf defaults-file を使用してデータベースの mysqldump を実行します
  • stdout に送信するので、ローカルでパイプできます
  • ユーザー foo は /etc/mysql/debian.cnf の読み取りを許可されていないため、リモートでサーバー上で sudo を実行している間。foo は sudo bash を許可されていますが、sudo mysqldump は許可されていません。

これは私が思いついた最高のものです:

echo 'mysqldump --defaults-file=/etc/mysql/debian.cnf dbname' | ssh -t -i keys/id_rsa -l foo example.com sudo bash -s

この醜い獣は機能しますが、生成します: Pseudo-terminal will not be allocated because stdin is not a terminal.、そして私はエコーが本当に好きではありません。もっと良い方法があるはずですか?

4

1 に答える 1

3

ssh -i keys/id_rsa foo@example.com sudo bash -c "'mysqldump --defaults-file=/etc/mysql/debian.cnf dbname'"

これは、sudo がパスワードを要求する必要がない場合にのみ機能します。その場合は、-tssh のオプションが必要です。

二重引用符と単一引用符に注意してください。外側の引用符はローカル シェルによって取り除かれ、'mysqldump --defaults-file=/etc/mysql/debian.cnf dbname'文字列全体が単一の引数として ssh に渡されます。Ssh はそれをリモートの sudo に渡すので、リモートには一重引用符が表示されます。リモート bash では、-c の後の部分を単一の引数として解釈するために単一引用符が必要です。

于 2012-11-05T01:20:43.180 に答える