2017-12-18 12 views
-1

私のスクリプトでは、特定の(デバイスドライバ)ファイルをFD3として開きたいとします。 exec 3<は、このような場合には正常に動作します。bash:sudo権限を持つファイル記述子を開く

しかし、デバイスドライバファイルはrootとしてしか読めないので、sudoを使ってrootとしてFDを開く方法を探しています。

- > sudo権限でファイル(ディスクリプタ)を開くにはどうしたらいいですか?

残念ながら、スクリプトの実行時にファイルを開いたままにしておく必要があります。そのため、パイピングのようなトリックは機能しません。 また、私はsudo権限の下でスクリプト全体を実行したくありません。

のsudo +幹部は、全く不可能である代替の解決策は、私がsudo tail -fのような背景で、プログラムを呼び出すことができることである場合 - しかし、これは問題の別のセットをもたらす:

  • かどうかを確認する方法プログラムの呼び出し成功
  • 呼び出しが成功しなかった場合のエラーメッセージの取得方法
  • 実行終了時にプログラムを "強制終了"する方法。

EDIT:

  • オープンは/ dev/tpm0
  • は、ユーザーの権限で私のコマンドを実行し、root権限を必要とする
  • 近くの/ dev/tpm0
  • : は私が達成したいものを明確にするために、

なぜなら、/ dev/tpm0を開くと他のコマンドがtpmにアクセスできなくなりますituation。

ありがとうございました

+1

解決しようとしている問題を示すコードを表示すると、これは簡単に答えることができます。 – larsks

+0

[OK]を私が達成したいことは次のとおりです。 *オープンは/ dev/tpm0ルートの権限を必要とする *ユーザー権限で、私のスクリプトを行う必要があるものは何でも *近くには/ dev/tpm0 この背後にある理由は、私ということですスクリプトの実行中に/ dev/tpm0へのアクセスをブロックする必要があります。 /dev/tpm0はブロッキング文字デバイスです。 – PeterH

+0

なぜあなたはrootとしてfdを開くことができますか? – 123

答えて

0

次のようなことができますか?あなたが最初のFD 3から読んだとき、あなたがFAILCODEを取得するかどうかを確認し、その後

exec 3< <(sudo cat /dev/tpm0 || echo FAILEDCODE) 

:このようなオープンできなかった、あなたができる何かを検出するために

# open the file with root privileges for reading 
exec 3< <(sudo cat /dev/tpm0) 

# read three characters from open file descriptor 
read -n3 somechars <&3 

# read a line from the open file descriptor 
read line <&3 

# close the file descriptor 
exec 3<&- 

。または、次のようなことをすることができます:

次に、/tmp/itfailedを確認してください。存在する場合、sudoコマンドは失敗しました。

+0

ありがとうございますlarsks、これは私が必要なものに非常に近いと思われます - ありがとう! 2つの問題が残っています - sudoのパスワードを入力しても機能しません(しかしこれはsudoを使って何か他のことをする前に回避することができます) と私はオープンが成功したかどうかを検出する方法がわかりません。 – PeterH

+0

あなたが言っているように、 'sudo'を使って問題を解決する方法はいくつかあります((a)パスワードなしでこの特定のコマンド*を許可する、あるいは(b)スクリプトの早い段階で資格を取得するなどがあります。失敗したI/Oリダイレクションからリターンコードを取得しないため、オープンが成功したかどうかの検出はややこしいです。私はいくつかのオプションを追加しました。 – larsks

+0

完全に異なる解決策は、 '/ dev/tpm0'をオープンする別のプロセス(' root'と同じ)を実行し、非rootスクリプトが制御されたファッション。 – larsks

関連する問題