私はこれに対する答えを高低で検索しました。キーを設定しているので、リモートホストへの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
そして私は同じ結果を得る。
まず、リモートシステムへのログインが問題のユーザーとして行われるようにキーベースの認証を変更します-その後、Sudoを使用する必要はありません(サービスがrootとして実行されていないことをすでに示しているため、セキュリティはありません)自動化されたキーベースのログインに関する懸念)。
次に、sshd_config(5)のForceCommandを見てください。これにより、1つのことしか実行できないはずのサービスアカウントを使用している場合に、セキュリティが強化されます。 Matchディレクティブへの参照に注意してください。
最後に、Sudoは、システム上のファイルの変更も伴うコマンドを実行すると、予期しない結果をもたらす可能性があります。これが、「Sudo echo foobar >>/etc/passwd」などが思ったとおりに機能しない理由です。これは、(問題の実際のスクリプトを見ないとわかりませんが)現在の状況の要因である可能性があります。上記の私の最初の提案に従ってください。そうすれば、この問題を完全に回避できます。 :)
あなたはこれを複雑にしすぎています。 ssh -t user@Host Sudo /path/to/command
だけで十分です(ファンキーな引用、エスケープ、su
の実行、サブシェルは不要です。コマンドを実行している場合は、リモートエンドで入力するのとまったく同じです。手動で)。
より複雑なコマンドを使い始めた場合は、引用符を付けてエスケープする必要があるかもしれませんが、これほど単純なものの場合は必要ありません。
Sudo
のパスワードを入力する必要がある場合は、SSHの-t
フラグが必要であることに注意してください。デフォルトでは、SSHはリモートコマンドセッションにttyを割り当てません(Sudoはそうでないことについて激しく不平を言います)パスワードを取得できます)。 -t
は端末を強制的に割り当てて、Sudo
が何かを操作できるようにします。
あなたの場合は必要ないかもしれませんが、実際には何も害はありません。