sudoを必要とするスクリプトがなければ、sudoを使用してプロンプトを表示する必要がありますか?


26

バックライトの明るさをきめ細かく制御できるスクリプトがありsudo、実行する必要があります。基本的にこれです:

backlight="/sys/class/backlight/acpi_video0/brightness"
echo $1 | tee $backlight

とに住んでい~/bin/backlight-adjustます。特権のある場所に書き込むsudoため、スクリプトには特権が必要tee $backlightです。したがって、で実行しないと失敗しますsudo

このアプローチには問題があります。なぜなら、私はただ実行するsudo backlight-adjustこと~/binはできないからです。なぜなら$PATHsudo環境の中ではなく、自分の環境の中だけにいるからです。だから私は走らなければならないsudo env "PATH=$PATH" backlight-adjustか、何か似たようなものが必要だ。

あるいは、次のように書くこともできます。

backlight="/sys/class/backlight/acpi_video0/brightness"
echo $1 | sudo tee $backlight

パスワードの入力を求められます。

2番目のアプローチは、sudoと入力することを覚えておく必要がないため、私にとってはうまく機能します。プロンプトが表示されます。そして、私はそのままにしておくことができ$PATHます。これは全体的に便利ですが、2番目の方法でこれを行うべきではない理由はありますか?

(Xubuntu 14.04を実行していますが、シェルがGNU bash 4.2.45である場合、違いが生じます。)


修正していただきありがとうございます。変更されたDebian(LMDE)を実行していますが、sudo実際には$PATHデフォルトで保持されているため、この問題はありません。
テルドン

回答:


27

個人的には、別のアプローチを使用します。スクリプトのエイリアスを作成します。この行を~/.bashrc(または他のシェルの同等の)に追加します

alias backlight-adjust='sudo ~/bin/backlight-adjust'

そうすれば、それを実行するのを覚えていることを心配する必要がなく、スクリプトsudoに追加する必要もありませんsudo。これは完全に透過的であり、実行しようとするときにパスワードを要求するだけですbacklight-adjust


これは非常に賢明なアプローチのようで、システムの他の部分への影響は最小限に抑えられています。+1。
ジョンフェミネラ14年

@JohnFeminella一方、このスクリプトを他の誰かと共有したい場合は、エイリアスも必要になります。個人的にはsudo、特にスクリプトのどの要素に実際にルート権限が必要かを簡単に確認できるため、実際のスクリプトに含めない理由はありません。
カイルストランド14年

@KyleStrandいいえ、彼らはしません。スクリプトによって呼び出されるコマンドは、アクセス権がないことについて単に文句を言います。
テルドン

@terdon私は少しはっきりしているかもしれないことを認識していますが、おそらくあなたは私が意図したことを知っているでしょう:スクリプトの受信者は、スクリプトの作者が最初に直面したのと同じ問題に直面するでしょう、そして、良心的なスクリプト共有者として、作者はすべきですまた、この特定の使用上のジレンマに対する個人的なソリューションを共有しています。
カイルストランド14年

@KyleStrandはい、しかし問題はありませんでした。OPが抱えていた唯一の問題は、彼がそれとは別に「sudoを入力することを覚えておく必要がない」ことでした。スクリプトは完全に移植可能です。私のポイントは、エイリアスは完全にオプションであり、何も解決しないということです。それにより、使いやすくなります。
テルドン

7

私は通常、コマンドが私に物事を尋ねないので、スクリプト化できるようにするのが好きですが、なぜそれが間違っているのかわかりません。パスワードなし/etc/sudoerssudo機能するように微調整できます。

しかし...なぜ追加しないのですか

chgrp  one-of-your-groups-here /sys/class/backlight/acpi_video0/brightness     
chmod g+w /sys/class/backlight/acpi_video0/brightness 

あなたの中で/etc/rc.local、忘れるsudo

(Ubuntuでは、使用できるsudo場合はsudoグループに属しているため、使用chgrp sudo /sys...して満足することができます。)


3

または、追加できます

Defaults        env_keep +="PATH"

あなたの/etc/sudoersファイルに。


2

あなたの状態の〜/ binがsudoの環境内の$ PATHにないためにsudo、バックライト調整

では、なぜそれに依存するのでしょうか?その行を変更するだけでうまくいくと思います/home/user/bin/backlight-adjust

しかし、エイリアスを使用するTerdonのソリューションも本当に欲しいです。または、スクリプトを配置して/usr/bin/、すべてのユーザー(ルートを含む)が使用できるようにすることもできます。


はい、しかしそれを行うのは面倒です。さもなければ、そもそもそれを私の$ PATHに入れる意味は何ですか?また、それは~/bin私の家のdotfilesリポジトリの下にあるので、それを持っているのが好きです。
ジョンフェミネラ14年

道による@JohnFeminellaは、単に使用し、変更パスする理由はありません-E。環境保全フラグをsudo -E command
terdon

@terdon Debianでは機能しません。セキュリティ上の理由で上書きされます。私の質問(sudo env "PATH=$PATH" ...)で述べたように、環境変数を明示的に渡す必要があります。
ジョンフェミネラ14年

1

一般的なルールを与えることはできません...スクリプト/プログラムが何らかの再構成(プリンタなど)を行うように設計されており、通常のユーザーによって呼び出される場合、それは必要です。それ以外の場合、私は十分に任せておきます:通常のユーザーがそれを実行する場合、失敗します(明示的なチェックの結果として、または何かをすることが許可されていないという理由だけで)。

昇格された特権は、たとえあったとしても控えめに配るべきです。より高い特権への切り替えは注意が必要ですsudo(1)。専門家に任せてください(例:)。


0

個人的${SUDO}にスクリプトのようなものを使用しているため、呼び出し元は必要に応じて設定したり${SUDO:-sudo}、デフォルトで使用したりできます。

あなたの特定のケースでは、受け入れられた答えがあります。


-1

スクリプトを(なしでsudo)のような適切なユーザー全体の場所に配置し、/binこれを実行します。

sudo chown root /bin/backlight-adjust
sudo chmod 4755 /bin/backlight-adjust

これは、setuidフラグを設定することで機能します。つまり、常にファイル所有者として実行されます。詳細については、http://major.io/2007/02/13/chmod-and-the-mysterious-first-octet/をお読みください。私はこれがどのように機能するかについてあまりあまり知りません。数年前に読んだと思ったものに基づいてグーグルであることがわかりました。


1
シェルスクリプトはこれ以上setuidできません、よろしくお願いします...これはまったく悪い答えです。特にセキュリティ面で。
ミラビロス14年

@mirabilosグループまたは一般書き込みフラグがオンの場合にのみ危険です。setuidのリスクは、ファイルに対する書き込み権限を持つユーザーは、ユーザーであるかのように好きなものを実行できることです。したがって、これらの書き込み権限を保護する必要があります。4755所有者として常に実行され、所有者は読み取り、書き込み、実行、グループは読み取りと実行、ユーザーは読み取りと実行が可能であることを意味します。これは、すべてのユーザーがroot権限で実行できるものの標準権限レベルです。
AJMansfield 14年

@mirabilosまた、setuidを使用したシェルスクリプトは、setuidを使用したバイナリよりも多くの脆弱性をもたらすという考えは馬鹿げています。バイナリは、settraceを利用する主なエクスプロイトであるptraceエクスプロイトの影響も受けません。
AJMansfield

2
現在のすべてのUnixライクなOSは、setuidスクリプトを禁止しています。これは事実です。あなたが私を信じないなら、理由を自分で尋ねてください。OpenBSDから始めます。
ミラビロス14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.