bashでsshとsudoを一緒に使用する方法は?


10

この特定のシナリオを説明する質問を見つけることができませんでした。

非常に基本的なbashスクリプトを実行して、複数のマシンからロギングを取得しようとしています。スクリプトをローカルで実行していますが、ssh経由で外部マシンにアクセスする必要があります。また、そのマシンで特権ユーザーにsudoを実行する必要があります...

ssh myuser@machine.net
sudo su  - privledged_user
cat logs > file.txt

これをsh -xで実行すると、bashが「ssh」行でスタックしていることがわかります。だから私はそれをこれに改訂しようとしました:

ssh myuser@machine.net sudo su - privledged_user cat logs > file.txt

これも無期限に停止しているようです。この問題のより良い解決策はありますか?sudo suを使用する方法がわかりません...

助けてくれてありがとう!


なぜ最終投票?この質問はトピックに関するものです:サーバー、ワークステーション、ストレージまたはネットワークのハードウェアまたはソフトウェアの管理、これらの管理、監視、または自動化に使用されるツール
jlliagre

回答:


5

現在の環境でこれを実現する方法は、次のように、-ttty割り当てを強制するフラグを指定してsshを実行し、その中でsudo -u rootを実行することです。

ssh -t hostname << EOF
  command1
  sudo -u root command2
  sudo -u otheruser "command3 | command4"
  sudo -u root /bin/bash -c "command5; command6; command7"
  command8 && ( sudo -u otheruser /bin/bash -c "cmd1 ${1}; cmd2 {$2}" ) || echo cmd2 did not work

EOF

私は自分のアカウントをリモート側のsudoersに持っているので、パスワードは必要ありません。

この例では、bashまたはサブシェルで複数のコマンドを実行するなど、単一のsshセッション内でこれを実行するさまざまな方法を示しています。上記のコードを実行可能スクリプトに挿入すると、コマンドライン引数($ 1と$ 2)をsshに渡すことができ、これらは展開されてリモート側で参照されます。


残念ながら、私はリモートサーバーを管理していないため、ここではsudo suを使用して立ち往生していると思います。それでもこの形式で機能しますか?
Matt124234 2014

はい、それも動作します。プロンプトが表示されたらパスワードを入力できます。
Michael Martinez 14

私は試しました:ssh -t mrhyner@stg-app3.indeed.net << EOF sudo su-adcentrl egrep 'ERROR \ | WARN' / home / adcentrl / cronjobs / logs / * / * EOFしかし、私は受け取りました: "Pseudo stdinはターミナルではないため、ターミナルは割り当てられません。」
Matt124234 2014

完全に大丈夫。その警告を無視して続行します。必要に応じて、リモートエンドの/ etc / sudoersで「RequireTty」を無効にできます
Michael Martinez

5

sudoがパスワードを要求するのを望まない、または止められない場合、簡単なトリックの1つは、ローカルで読み取ってローカル変数に保存することです。

read -p 'Password: ' -s password

ssh -t user@1.2.3.4 <<EOF
  echo "$password" | sudo -S whoami
EOF

1

sudoがパスワードなしのコマンドを許可するように構成されている場合、これはあなたが望むことをするはずです:

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs'" > file.txt

または

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs > file.txt'"

file.txtファイルをローカルで作成するかリモートで作成するかによって異なります。

それ以外の場合、リモートユーザーのパスワードをに渡す方法はsudo次のとおりです。

echo mrhyner_password | \
  ssh mrhyner@test-server.net \
  "sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"

とても興味深い。ただし、-tを指定せずにsshを使用すると、「ttyが存在しない」ことがわかります。-tを追加すると、このエラーは削除されますが、パスワードの入力を求められるため、「sudo su」を尊重しないようです。具体的には次のとおりです。ssh -t mrhyner@test-server.net "sudo su-adcentrl -c egrep" ERROR \ | WARN "/ home / adcentrl / cronjobs / logs / * / *"これにより、bashが得られます。 :警告:コマンドが見つかりませんでしたmrhynerの[sudo]パスワード:
Matt124234

申し訳ありません、どうやらこのことでコメントをフォーマットする方法がわかりません
Matt124234

私は、sudoがリモートアカウントに対してパスワードなしに設定されていると想定していました。
jlliagre 2014

余分な一重引用符が不足しています。
jlliagre 14

それが原因で、bashが何らかの理由でsshコマンドを受け入れていないという理由が生まれました。ローカルホストからsudoを実行しようとしているように機能します= \
Matt124234
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.