web-dev-qa-db-ja.com

Linux:sshでホストし、Sudoを使用してスクリプトを実行しますが、スクリプトの一部が失敗します

私はこれに対する答えを高低で検索しました。キーを設定しているので、リモートホストへのsshにパスワードは必要ありません。そのユーザーにSudoを設定して、パスワードなしでrootとして必要なコマンドを実行できるようにしました。私は数日間、sshを使用してリモートコマンドを実行しているだけです(なんて素晴らしい発見でしょう!)。

少し背景:リモートホストで実行されているスクリプトは、プログラムの一般的な開始/停止スクリプトです。実際のプログラムのどこかで、書き込み用にログファイルが開かれます。リモートホストでは、スクリプトをrootとして実行すれば、すべて問題ありません。ユーザーとして実行すると、エラーが発生します:log4cplus:ERROR Unable to open file: appname.log。ログはrootが所有しているため、理にかなっています。

さて、状況:ローカルホストにリモートホストにSSH接続するスクリプトがあり、Sudoを使用するとそのスクリプトが実行されます。スクリプトを実行できます。ただし、起動後、ログファイルについて上記と同じエラーが発生します。次のことを試しましたが、すべてスクリプトを正常に実行しましたが、エラーが発生します。いくつかは必要ないことはわかっていますが、見つけたすべての塩基をカバーしたかったのです(-tでも試しましたが、違いはありません。そうなるとは思いませんが...):

/usr/bin/ssh username@remotehost sh -c Sudo "/etc/rc3.d/S99script start"

/usr/bin/ssh username@remotehost sh -c Sudo "/etc/rc3.d/S99script start"

/usr/bin/ssh username@remotehost 'sh -c Sudo "/etc/rc3.d/S99script start"'

/usr/bin/ssh username@remotehost Sudo /etc/rc3.d/S99script start

/usr/bin/ssh username@remotehost "Sudo /etc/rc3.d/S99script start"

/usr/bin/ssh username@remotehost Sudo "/etc/rc3.d/S99script start"

/usr/bin/ssh username@remotehost 'Sudo "/etc/rc3.d/S99script start"'

/usr/bin/ssh username@remotehost Sudo su - -c "/etc/rc3.d/S99script start"

/usr/bin/ssh username@remotehost 'Sudo su - -c "/etc/rc3.d/S99script start"'

私が試したことが他にもあることは知っていますが、それらすべてを文書化したわけではありません。さまざまな引用符をすべて試したことを笑わないでください。一般的にいつ使用するかについては十分に理解していますが、さまざまなことを試すことに変更はありませんでした:)

これらを実行しているときに気付いたのは、スクリプト名に対してps -ef | grepを実行すると、次のように表示されることです。

[username's UID]  3070  3069  0 14:42 ?   00:00:00 bash -c /etc/rc3.d/S99script start

それは私が「sh-cSudo」をしている人たちにも当てはまります。 bash -cとして実行されているという事実は興味深いですが、ユーザー名の代わりにユーザーのUIDがリストされていることも興味深いです(私は思ったのですか?)。

**追加:「username」のホームディレクトリに次のようなスクリプトを作成してみました:Sudo /etc/rc3.d/S99script startそして私は同じ結果を得る。

3
Sama

まず、リモートシステムへのログインが問題のユーザーとして行われるようにキーベースの認証を変更します-その後、Sudoを使用する必要はありません(サービスがrootとして実行されていないことをすでに示しているため、セキュリティはありません)自動化されたキーベースのログインに関する懸念)。

次に、sshd_config(5)のForceCommandを見てください。これにより、1つのことしか実行できないはずのサービスアカウントを使用している場合に、セキュリティが強化されます。 Matchディレクティブへの参照に注意してください。

最後に、Sudoは、システム上のファイルの変更も伴うコマンドを実行すると、予期しない結果をもたらす可能性があります。これが、「Sudo echo foobar >>/etc/passwd」などが思ったとおりに機能しない理由です。これは、(問題の実際のスクリプトを見ないとわかりませんが)現在の状況の要因である可能性があります。上記の私の最初の提案に従ってください。そうすれば、この問題を完全に回避できます。 :)

0
darkuncle

あなたはこれを複雑にしすぎています。 ssh -t user@Host Sudo /path/to/commandだけで十分です(ファンキーな引用、エスケープ、suの実行、サブシェルは不要です。コマンドを実行している場合は、リモートエンドで入力するのとまったく同じです。手動で)。
より複雑なコマンドを使い始めた場合は、引用符を付けてエスケープする必要があるかもしれませんが、これほど単純なものの場合は必要ありません。

Sudoのパスワードを入力する必要がある場合は、SSHの-tフラグが必要であることに注意してください。デフォルトでは、SSHはリモートコマンドセッションにttyを割り当てません(Sudoはそうでないことについて激しく不平を言います)パスワードを取得できます)。 -tは端末を強制的に割り当てて、Sudoが何かを操作できるようにします。
あなたの場合は必要ないかもしれませんが、実際には何も害はありません。

4
voretaq7