ファイルパイプを使用した非ルートSSH特権コマンド

ファイルパイプを使用した非ルートSSH特権コマンド

ルートログインが無効なSSHサーバーがあります。実行後にファイルから入力を必要とする特権コマンドを実行したいと思います。ユーザーの介入なしにonelinerコマンドまたはスクリプトを介してすべての操作を実行したいと思います。

キー認証設定があるため、コマンドを実行するときにのみ次のパスワードが必要です。

私が得た最も近いのはこれでした echo "mypass" |ssh -tt user@ip "sudo specialCommand"

出力は次のとおりです。

mypass  
[sudo] password for user: 
specialCommand requests inputfile contents

mypassは以前に印刷され、パスワードプロンプトも許可されました。

commandInputパスワードが承認されたら、パイプで接続したいファイルがあります。

私は推測ゲームに過ぎない様々な試みをしましたが、失敗しました。どうすればこれを達成できますか?

答え1

どうですか?

(echo "mypass"; cat commandInput) | ssh -tt user@ip "sudo specialCommand"

または、明らかにsudoリモートホストにアクセスできるので、visudoこの行を/etc/sudoers(using後ろにsudoパスワードアクセスを許可する既存の行user)?

user  ALL=(root) NOPASSWD: /full/path/of/specialCommand

この行は、ユーザー(他の人ではない)に、パスワードなしでuserroot(他のユーザーを除く)として実行する権限を与えます。specialCommandこの行を介して他のコマンドを実行するには、通常sudoどおりパスワードが必要です。

その後、以下を簡単に実行できます。

ssh -tt user@ip "sudo specialCommand" < commandInput

答え2

specialCommand実際にはttyを必要とせず、ssh パスワードプロンプト用にttyを作成する必要がある場合は、他のオプションは次のとおりです。sudo

(echo "mypass" ; cat commandInput) | ssh user@ip "sudo -Sp '' specialCommand"

オプションを使用すると、標準入力-S(この場合はsudoユーザー入力)からパスワードを読み取ることができ、オプションを使用するとパスワードプロンプトは表示されません。echo "mypass"-p ''

その後、適切な権限で保護された別々のファイルにパスワードを入れることができます。これは通常、スクリプトにパスワードを直接接続するよりも優れた方法です。コマンドは次のとおりです。

cat passwordFile commandInput | ssh user@ip "sudo -Sp '' specialCommand"

後者の場合、確実にするパスワードファイルには1行だけが必要です。パスワードのみがあり、他には何もありません。それ以外の場合は、パスワード行の後ろの内容がspecialCommand

関連情報