sudoers
ファイルには、すべての演算子の/bin/mount -t cifs //*/* /media/* -o username=*
コマンドが既に含まれていますcifs
共有をマウントしてもらいたい。このスクリプトは動作します:
#!/bin/bash
Sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'
...しかし、ユーザーは同じパスワードを2回入力する必要があります!
Sudo
に1回これも機能します:
#!/bin/bash
echo -n Password:
read -s szPassword
echo $szPassword | Sudo -S sh -c 'echo $szPassword | mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'
...しかし、これはすべてのオペレーターユーザーがSudo sh
(重大なセキュリティ問題)をできるようにすることを要求します
cifs共有をマウントする方法bashで¹sh
をsudoers
ファイルに入れずにまたは永続/一時を作成しないファイル???
注1: python、Perl、C、Goは使用しないでください...
注2:sudoers
ファイルを介してパスワードを削除できることはわかっていますが、セキュリティを強化しようとしています。利便性をあきらめます...
次のスクリプト:
#!/bin/bash
read -p "Password: " -s szPassword
printf "%s\n" "$szPassword" | Sudo --stdin mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER,password="$szPassword"
動作するだけで:
代わりに、SudoをSudo script
として使用する呼び出しをユーザーに実行させる必要があります。スクリプトがrootとして実行されているかどうかを確認します(要求されていない場合)
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root, use Sudo "$0" instead" 1>&2
exit 1
fi
ユーザーのパスワードをキャプチャしようとしないでください。
このコマンドを実行するためにSudo
パスワードは必要ありません;パスワード_mount
のプロンプトは残ります。
sudoers
に、次のようなものを含めます
ALL ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*
これを含めると、Sudo
はこの特定のコマンドのパスワードを要求しなくなります。ユーザーは引き続きmount
コマンドにパスワードを提供する必要があります。
注:あなたが質問に含めたものから逐語的にコマンドを取りました。ワイルドカードを使用してユーザーが何か厄介なことを行うことができるかどうかは確認しませんでした。意地悪の例については、sudoers
マンページを参照してください。 特に、sudoers
のこの行により、ユーザーは-o
スイッチまたは他の引数を任意の数のmount
に追加できることに注意してください。 @Braiamなどのスクリプトを追加することにより、追加の認証なしでSudo
を介して実行することを提案および許可します。スクリプトは、ユーザーが実行したい特定の形式のmount
のみを実行できるようにします。
また、これをすべてのユーザーに許可する代わりに、これを特定のグループのメンバーに制限することもできます。グループcifsmount
を作成してから、
%cifsmount ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*
これらの問題の一般的な解決策は、スクリプトを必要とするSudoの先頭に次の前文を置くことです。
#!/bin/bash
case $EUID in
0) : cool we are already root - fall through ;;
*) # not root, become root for the rest of this session
# (and ask for the Sudo password only once)
Sudo $0 "$@" ;;
esac
# now the present process is effective-UID (root)
# so there's no need to put Sudo in front of commands
any more commands here will run as superuser ...
明らかに、これには、スクリプト内の一部のコマンドを実行するのにSudo
を必要としない場合、ここで不要な特権の昇格があるという欠点があります。
とにかく、私はこの小さなヒントを共有すると思いました。それについての最も素晴らしいことは、あなたがすでに実効UIDルートである場合(例えば、あなたがすでにSudoの下でそれを呼び出している場合)、それは正常に正しいことをするということです。また、エラーを発生させ、再入力/再実行(Sudoを使用)を強制することは、あまりフレンドリーではありません。
timestamp_timeout
のman 5 sudoers
変数をチェックアウトすると、Sudo
にユーザー資格情報を限られた数分間記憶するように指示できます(数分の一の場合もあります)。