BashスクリプトでPIPE以降のパラメータを文字列としてキャプチャする

BashスクリプトでPIPE以降のパラメータを文字列としてキャプチャする

私はsudoを使用する「理由」を収集して記録するための単純なスクリプト(まあ、簡単だと思います)を書いています。私が見つけた別の記事によると、この部分は非常に簡単に動作します(https://community.unix.com/t/sudo-prompt-for-comment-text/265046/4)。

しかし、ユーザーがコマンドにPIPE(|)を使用すると、私のスクリプトはクラッシュします。

mysudo.sh cat /var/log/syslog | grep -i something

上記のコマンドを使用すると、スクリプトはパイプで効果的に一時停止し、Enter / Returnを押すまで何もしません。その後、ifドアを迂回し、空のカーソルで「そこに座って」います。 Enterキーを押すと、入力したsudoコマンドが実行されますが、何も記録されません。

私が次のようなものを使用している場合:

./mysudo.sh ls -lh /var/log/syslog

if ステートメントがトリガーされると、ユーザーが GROUP グループにある場合は、理由を尋ねるメッセージが表示され、イベントが記録され、sudo とコマンドが正しく実行されます。

私が望むのは、「mysudo.sh」の後のすべてのデータを文字列としてキャプチャし、それを私のスクリプトで使用することです。誰でもこれを行う方法はありますか?最終目標は、特定の条件が満たされたときに理由を入力する必要があることを除いて、エンドユーザーがラッパーについてまったくわからないように、この新しいスクリプトをsudoにシンボリックリンクすることです。私の考えは、パラメータ(パイプの後の項目を含む)を文字列としてキャプチャし、2つのsudo行(および理由文字列)を次のように変更することでした。

ENTEREDCOMMAND=<the string of arguements, including the pipe and other data> ... sudo ${ENTERETEDCOMMAND}

(この質問を例にしてみてください)

ENTEREDCOMMAND would equal "cat /var/log/syslog | grep -i something" ... sudo ${ENTERETEDCOMMAND}

スクリプトは次のとおりです。

どんな助けでも大変感謝します!

logFile=/path/to/log.log
shopt -s nocasematch
clear

GROUP=$(groups | grep -i "GROUP")

if [[ ${GROUP} =~ "GROUP" ]];
then //if user is GROUP capture the reason for sudo, then proceed with sudo
  echo '
  Enter the reason for executing the command with elevated privileges (include a ticket # is possible): '
  read response
  echo "$USER" 'executed "'${*}'" at '"$(date)"' with a reason of "'${response}'".' >> $logFile
  sudo $*
else
  sudo $* //if the user is NOT in the GROUP above, run sudo as normal
fi

ベストアンサー1

おすすめ記事