1

わかりました、ここにトリッキーな質問があります:

まず、Unixマシンで実行される非常に小さなCアプリケーションがあります。このアプリケーションは2つの引数を取得し、次のようにLinux(Ubuntu)マシンで.shファイルを実行しようとします。

./myapp luke leia

さて、Cコードは多かれ少なかれこれを実行します:

char temp[512];
sprintf(temp, "ssh user@server \"sh \\$HOME/save.sh %s %s\"", argv[1], argv[2]);
system((char *)temp);

ご覧のとおり、Linuxサーバーへの接続が開き、「ユーザー」のホームフォルダーでバッチスクリプトが実行されます。ターミナルで直接試してみると、次のようになります。

ssh user@server "sh \$HOME/save.sh luke leia"

私のUnix側では、SSHのパスワードを求められますが、それは問題なく機能します。Unixマシンのsave.shファイルからすべてのエコーを取得しますが、sudo権限が必要な場合を除いて、正常に機能します。だから私は自分のサーバーでこれを試しました:

  1. sudo visudoサーバーで使用して、%sudo ALL=(ALL) ALL私が置いたと言う行の下に:

    %user ALL=(ALL) NOPASSWD: /home/user/save.sh

  2. 私のsave.shは次のようになります。

#! /bin/bash
sudo echo "[save action] args: ${1} , ${2}" >> /somewhere/save.log;
echo "${1} and ${2} are brother and sister.";
  1. 私のフォルダ「どこか」はrootに属しているので、通常、私の「ユーザー」はそれを保存できません。そこで、代わりにこのコマンドを処理するようにアプリケーションのコードを変更しました。

ssh user@server "sudo sh \$HOME/save.sh luke leia"

今、私はこのエラーを受け取ります:

sudo: no tty present and no askpass program specified

sudoを使用してこのスクリプトをトリガーし、rootパスワードの入力を求められないようにするための最良の方法はどれですか?を使ってみ-tましたが、rootパスワードを聞かれます。何かご意見は?

4

3 に答える 3

1

私の頭に浮かぶ解決策は、Cプログラムの追加パラメーター(argv [3])として「サーバー」マシンのルートパスワードを提供することです。

char temp[1024];
snprintf(temp, sizeof(temp), "ssh user@server \"echo %s | sudo -S -s \\$HOME/save.sh %s %s\"", argv[3], argv[1], argv[2]);
system((char *)temp);

-sudoのSは、パスワードがstdinを介して提供されることを意味するため、ユーザーの操作は必要ありません。それは理論的な解決策です(私はそれをチェックする時間がありません-申し訳ありません)あなた自身のためにそれをチェックしてくださいそしてそれがうまくいくかどうか教えてください。

于 2012-11-05T14:45:43.190 に答える
0

sudoを使用してこのスクリプトをトリガーし、rootパスワードの入力を求められないようにするための最良の方法はどれですか?

プログラムがターゲットと通信できるように、stdin / stdout/stderrストリームをリダイレクトする必要があります。system()これは、「ショットアンドフォーゲット」ソリューションでは実行できません。

ただし、Cプログラムをrootとして実行すると、質問が削除され、タスクが簡素化されます。

(クライアント)プログラムは、特定の時点でそれらを使用するために資格情報を必要とするため、それが解決策になる可能性があります。

于 2012-11-05T13:43:32.200 に答える
0

空のパスフレーズを持つキーを使用して、リモートrootアカウントのに公開キーを追加することができます(そして使用する必要があります)authorized_keys

于 2012-11-05T16:08:23.550 に答える