SSブログ
小技(Linux) ブログトップ
- | 次の10件

特定のユーザー(アカウント)に「パスワード無し」でsudoコマンド操作を許したい [小技(Linux)]

 sudoついでに。

 たとえば、サーバのシャットダウンやリブートを、他のユーザーにも実行できる(依頼できる)ようにしたいが、rootのパスワードは渡したくない。というケースを想像してほしい。そのユーザーは十分信頼に値するが、たとえばルール(規約)上rootのパスワードは渡せないケースとかそんな感じだろうか。

 そんな場合にもsudoコマンドを用いれば問題が解決できる。
 実は、/etc/sudoersファイルの中を見てみると、なんとなくソレっぽい記述が有ることに気が付くと思う。
## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now

 「usersグループのメンバーがこのシステムをシャットダウンすることを認める」というようなコメントが記述されているので、コレをアレンジすればいいんじゃないか!?   …みたいな幻想を抱いてしまいがちだ。(笑)現実はそんなに甘くないのだが。(笑)

 「piro791」さんに、sudoコマンドでサーバをシャットダウンする権限を与えてみよう。上記のコメントから推測してアレンジしてみると、こんな風に書いてしまうことだろう。

piro791 localhost=/sbin/shutdown -h now

 これでOK!と思って実際に試してみるとうまくいかないんだコレが。(笑)
[piro791@Welsper ~]$ sudo /sbin/shutdown -h now
パスワード:

 パスワード?
 知らねーYO!

 実際にはrootのパスワードを聞かれている。
 実は、manコマンドで/etc/sudoersの記述方法について読めばちゃんと書いてあるのだが、長い上に判りづらいので、読み飛ばしてしまう人が多数という状態らしいね。(笑)

 パスワードを無しにコマンドを実行させたい場合は、「NOPASSWD:」というキーワードが必要だったりするんだな。つまり、

piro791 localhost=NOPASSWD: /sbin/shutdown -h now

 このように記述する必要があったと。
 で、visudoコマンドでこのように記述して試してみる。
[piro791@Welsper ~]$ sudo /sbin/shutdown -h now
パスワード:

 …。
 嘘つきー!!

 とか怒らないように。(笑)
 実は、manコマンドの記述では特に書いてないのだが、今度は「localhost」と記述した部分がいけないのであった。(笑)実はここ、「uname -n」して表示される名前を書き込む必要があった。(だから、もともとlocalhostと名前が設定されている場合は、上記のままの設定でうまくいってしまう)
 例示しているサーバの名前は「Welsper」なので、つまり…

piro791 Welsper=NOPASSWD: /sbin/shutdown -h now

 と、しなければならないのであった。
 再度試してみよう。
[piro791@Welsper ~]$ sudo /sbin/shutdown -h now

Broadcast message from root (pts/0) (Thu Feb 25 11:09:43 2010):

The system is going down for system halt NOW!
[piro791@Welsper ~]$

 やっとうまくいった。(笑)

 なお、shutdownでなく、「poweroff」とか「reboot」とかを使う人もいると思うが、そちらも許可したいという場合は、

piro791 Welsper=NOPASSWD: /sbin/shutdown, /sbin/poweroff, /sbin/reboot

 という具合に、カンマで区切って列挙すればよい。
 また、バラバラに記述しても構わない。(その場合はそれぞれに「NOPASSWD:」の記述を忘れないように。)

piro791 Welsper=NOPASSWD: /sbin/shutdown
piro791 Welsper=NOPASSWD: /sbin/reboot
piro791 Welsper=NOPASSWD: /sbin/poweroff

 こんな具合。


 さらについでなんで書いておこうかな。

 「rootとして実行したい」のではなく、他のユーザー(アカウント)の権限として実行したい!というケースもあるかもしれない。たとえば、apacheユーザーとして動作しているhttpdから起動されるCGIを、「piro791」権限でパスワード無しで実行したいというケース。

 そんな場合は、「誰の権限が欲しいか」という指定を追加する。(これが無い場合はroot)
 apacheユーザーで実行されるCGIが、Welsperサーバ上の「piro791」ユーザーの権限で、パスワード無し/home/piro791/bin/hogehogeというコマンドを実行したい場合はこんな感じ。

apache Welsper=(piro791) NOPASSWD: /home/piro791/bin/hogehoge

 「(piro791)」という記述が追加されている。これによって、「piro791」アカウントでの実行が許可される。

 sudoコマンドを実行する場合は、「-u piro791」をつけて実行する。

sudo -u piro791 /home/piro791/bin/hogehoge

 ということ。


 さらについでに書いておこう。

 特定のコマンドについていちいち許可を出すのではなく、特定のディレクトリにあるコマンドは全部許可したい場合。たとえば、apacheから呼び出されるCGIは、/home/piro791/binディレクトリの中にあるコマンドはどれでもpiro791権限で実行してもよろしいという場合。
 自宅サーバとか社内のサーバとかで、CGIが次々と追加されていく状況下で、いちいちコマンドを列挙するのが面倒だという向きに向いているとおもう。そのような場合は、コマンド名の替わりにコマンドが置いて有るディレクトリを記述すればよい。

apache Welsper=(piro791) NOPASSWD: /home/piro791/bin/

 このようにすれば、/home/piro791/binディレクトリにある全てのコマンド(や各種スクリプト)についてはapache権限のCGIなどからpiro791権限でパスワードの入力なしで実行することが許される。

cronやその他の方法で起動されるバッチ処理内でsudoしたい場合 [小技(Linux)]

 手動でコマンド操作する以外の方法、つまり、cronやcgi等の方法で起動されるバッチ処理等の中でsudoコマンドを使用したいというケースも地味に少なくないと思う。
 しかし、良く聞かれる「お悩み」に…

 手動でコマンドを流すとsudoできるのに、cron(とかatとかcgiとか…)から実行するとうまくいかない~

 というものが。

 そんな場合の対応方法。

①rootで visudo を実行する。
②「Defaults requiretty」という記述をコメントアウトする。(行の先頭に「#」をつける)
visudoコマンドを終了する。(ぶっちゃけ、viなので「:wq」でよい)

 意外と知られていないようなので。

教えて!gooに部外者が勝手に回答してみるテスツその1(?) [小技(Linux)]

 閑話休題なエントリーでございまする。

 興味がわいたので、このblogのURLでgoogle検索してみたところ、「教えて!goo」のある質問にたどり着きました。
 ディレクトリの中身を出すコマンド(SSH)(http://oshiete1.goo.ne.jp/qa4750204.html)

 あるディレクトリ階層下にあるファイルを、カレントディレクトリにずらっと並ぶように移動させたい…ということでしょうかね。

 ためしに、以下のようにして実験環境を作ってみました。
[root@konata ~]# mkdir /tmp/test
[root@konata ~]# cd /tmp/test
[root@konata test]# cp -r /etc/sysconfig ./sysconfig
[root@konata test]# ls -la
合計 20
drwxr-xr-x 3 root root  4096 12月17日 15:42 ./
drwxrwxrwt 5 root root 12288 12月17日 15:42 ../
drwxr-xr-x 6 root root  4096 12月17日 15:42 sysconfig/

 これで、/tmp/testというディレクトリの下に、sysconfigというディレクトリとそのサブディレクトリやらファイルやらがまるっとコピーされた状態になりました。
 ディレクトリツリーを見てみると…
[root@konata test]# find . -type d -print
.
./sysconfig
./sysconfig/networking
./sysconfig/networking/profiles
./sysconfig/networking/profiles/default
./sysconfig/networking/devices
./sysconfig/console
./sysconfig/modules
./sysconfig/network-scripts

 こんな感じ。
 で、このディレクトリ軍団の中にあるファイルが、ずらりと今いるディレクトリに並べばよい…のかな。

 だとすれば、findコマンドを使えば話は早いような?

[root@konata test]# find . -type f -exec mv {} . \;
[root@konata test]# ls -la
合計 336
drwxr-xr-x 3 root root  4096 12月17日 15:42 ./
drwxrwxrwt 4 root root 12288 12月17日 15:35 ../
-rw-r--r-- 1 root root   126 12月17日 15:35 authconfig
-rw-r--r-- 1 root root   726 12月17日 15:35 autofs
-rw-r--r-- 1 root root    38 12月17日 15:35 clock
-rw-r--r-- 1 root root    11 12月17日 15:35 desktop
-rw-r--r-- 1 root root    25 12月17日 15:35 grub
-rw-r--r-- 1 root root    25 12月17日 15:35 grub.rpmsave
-rw-r--r-- 1 root root  1331 12月17日 15:35 harddisks
-rw-r--r-- 1 root root 10479 12月17日 15:35 hwconf
-rwxr-xr-x 1 root root    94 12月17日 15:35 i18n*
-rw-r--r-- 1 root root   106 12月17日 15:35 ifcfg-eth0
-rw-r--r-- 1 root root   212 12月17日 15:35 ifcfg-eth0~
-rw-r--r-- 1 root root   254 12月17日 15:35 ifcfg-lo
(以下省略)

 sysconfigディレクトリ以下にあったファイルがずらーっとカレントディレクトリに移動してきました。なお、違うディレクトリに同じ名前のファイルがあった場合とかの挙動は保障できませぬ。(笑)
 あと、/etcとか/varとかの下でうっかりこんなコマンドを流してしまったらひどいめにあうのは確実なのでお気をつけて~

 なお、他にもいくつか方法はあるような気はしますが、もっとナイスな方法がありましたらコメントをお寄せください。(笑)





 ところで…質問のタイトルに「(ssh)」とわざわざ書き添えてあるのはなんでだろう…???

CentOSでxfsを使いたい場合(CentOS5.x系編) [小技(Linux)]

 実は以前、カーネルをコンパイルする動機として、「xfsを使いたい場合」とか例示したが、実はCentOS5.x系ならそんなことしなくても良かったりするのである。(笑)

#ま、あれはあくまでも「例」ってことで…

 ファイルシステムがext3では都合が悪い場合があるかもしれない。その様な場合にはext4とかxfsとかRaserFSとかの出番なんだろうが、おそらくxfsという選択をする人が多いのではなかろうか。

 以前のCentOSだと、リポジトリサーバを変更したりなんたりかんたりと地味に面倒くさかったが、今時ならそんなこと必要無い。

 以下の通りの操作でxfsがあなたの物に!!!

手順1:xfsのカーネルモジュールとxfs操作用のコマンドを追加インストールする。

 方法は簡単。「kmod-xfs」と「xfsprogs」の2個をyum でインストールするのである。
  yum install kmod-xfs xfsprogs

 もし、必要なら「xfsdump」もインストールすればよろしかろう。

手順2:サーバをリブートする。

 shutdown -r now

 以上。

 これだけでxfsが使えるのである。あとはmkfs -t xfs /dev/hogehogeしたりmount -t xfs /dev/hogehoge /mnt/hogehogeしたり/etc/fstabに記述したりすればOK!!

メディアプレイヤーでsambaの共有を見ると文字が化けるか、漢字が表示されない [小技(Linux)]

 PCではなく、いわゆる「ネットワークメディアプレイヤー」みたいな機械でPCとかNASとかの中にある動画ファイルを再生しようとすると、機械によっては当blogで紹介しているsambaサーバ設定ではファイル名の取得が出来ないか、または文字化けを起こすことがあるようだ。
 原因はおそらく、ネットワークメディアプレイヤー側がUTF-8に対応していないためと思われる。

 このようなケースでの対処方法を紹介する。

 まず、/etc/samba/smb.confファイルを編集する。
 [global]セクションのどこかに、「dos charset = cp932」を追記する。
 変更した設定ファイルを保存したら、sambaを再起動する。「service smb restart

 これでアクセスできるようになったと思う。ネットワークメディアプレイヤーからファイルの一覧を取得できることを確認してもらいたい。

コマンドエイリアスを「今だけ」無効にしたい [小技(Linux)]

 意外と知られてないということにびっくりしたのでさくっと書いておく。

 Linuxを使っていると、誰にも何も頼んでいなくても自動的にコマンドエイリアスがいくつか設定された状態になっている。

[root@test-server tmp]# alias
alias cp='cp -i'
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias mv='mv -i'
alias rm='rm -i'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'


 こんな具合に。
 lsコマンドがに表示されてみたり、ファイルを消そうとrmコマンドを実行すると、いちいちファイルを消しますか?みたいな質問をしてくるのである。
 もしかしたら、職場や学校などで設置しているサーバにはこれら以外にも様々なエイリアスを設定し、快適なオペレーション環境を構築しているかもしれない。

 が…

 ごくまれに…

 この便利なはずのエイリアスがとてつもなく邪魔くさく感じられて仕方がないケースもありうる。

 例えば、「なlsコマンドの結果が気に入らないので、色無しで表示させたいが、今実行する1回だけalias ls='ls --color=tty'を無効にしたい!」とかいう場合。

 このようなコマンドエイリアスが指定されていると、例えば

 ls -la /tmp

 と実行した時、実はls --color=tty -la /tmpと実行したことになり、結果的にな表示になるのである。

 コマンドエイリアスを、そのターミナルからログオフするまでずーっと無効にしたいなら、unaliasコマンドを使えばよろしい。
 が、今実行する1回だけという場合は、簡単に明示的にエイリアスを無効にする方法がある。

 それは…



 コマンドの頭に \ を付ける

 だけ。そんだけ。

 つまり、 ls -la と実行したなら、な表示になるところ、 \ls -la と実行すると、地味な表示となるのである。
[root@test-server tmp]# alias rm
alias rm='rm -i'


 こんなエイリアスがある場合、
[root@test-server tmp]# touch testfile
[root@test-server tmp]# rm testfile
rm: remove 通常の空ファイル `testfile'?


 と、聞かれる。まあ、rm -fとすれば良いのだが、こういう場合にも、
[root@test-server tmp]# touch testfile
[root@test-server tmp]# \rm testfile
[root@test-server tmp]#


 と、このようにエイリアスが無かったことになってコマンドが実行されるのである。

 さりげなく使ってみよう!(笑)

SELINUXが原因でLinuxの起動に失敗する場合 [小技(Linux)]

 SELINUXが原因で、Linuxの起動に失敗することがある。 /etc/sysconfig/selinux の編集ミスでカーネルパニックを引き起こすとか、変なドライバーとかモジュールとかを読み込もうとして失敗して固まるとか、そういうケース。

 そんな時の対処方法。

手順1:GRUBのメニューが表示されたら、何かキーを押してメニューに入る
手順2:行の先頭にkernelと記述のある行を選択し、「e」キーを押す
手順3:行の後ろまでカーソルを移動し、「selinux=0」と書き足してEnterキーを押す
手順4:「b」キーを押してブートする

 この方法で、/etc/sysconfig/selinuxの記述内容に関わらず、最初からSELINUXが無効な状態で起動する。
 ちなみに、CentOSをインストールする際に、カーネルの起動パラメータを記述できる部分がある。ほとんどの場合はそこでは何も書かずにインストールを進めてしまうと思うが、最初から「SELINUXなんて使わないZE!」という場合はこの段階から「selinux=0」と書き足してしまうのも手である。

LinuxなマシンでUSB2が使えるのか知りたい [小技(Linux)]

 雑誌とかいろんなサイトとかで、「LinuxはどこかのOSと違ってリソースをバカ食いしないので、2~3世代前の古いPCでも快適に使えるよ!」みたいな事を書き立てるので、真に受けて古いPCとかマザーとかをLinuxにしてファイルサーバとかやってみた!みたいな人をちらほら見かけるのですが、古いマザーだと希に「USB 2.0が使えないYO!」ってなことに遭遇する訳です。
 そこで、Linuxのコマンドラインから「この子はUSB 2.0が使えるのかすら?」という疑問を解決する方法を紹介します。

 lspci コマンドを使います。

# lspci
0:00.0 Host bridge: Intel Corporation 82P965/G965 Memory Controller Hub (rev 02)
00:01.0 PCI bridge: Intel Corporation 82P965/G965 PCI Express Root Port (rev 02)
00:1a.0 USB Controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Contoller #4 (rev 02)
00:1a.1 USB Controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #5 (rev 02)
00:1a.7 USB Controller: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #2 (rev 02)
00:1c.0 PCI bridge: Intel Corporation 82801H (ICH8 Family) PCI Express Port 1 (rev 02)
00:1c.4 PCI bridge: Intel Corporation 82801H (ICH8 Family) PCI Express Port 5 (rev 02)
00:1c.5 PCI bridge: Intel Corporation 82801H (ICH8 Family) PCI Express Port 6 (rev 02)
00:1d.0 USB Controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #1 (rev 02)
00:1d.1 USB Controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #2 (rev 02)
00:1d.2 USB Controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #3 (rev 02)
00:1d.7 USB Controller: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #1 (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev f2)
00:1f.0 ISA bridge: Intel Corporation 82801HB/HR (ICH8/R) LPC Interface Controller (rev 02)
00:1f.2 IDE interface: Intel Corporation 82801H (ICH8 Family) 4 port SATA IDE Controller (rev 02)
00:1f.3 SMBus: Intel Corporation 82801H (ICH8 Family) SMBus Controller (rev 02)
00:1f.5 IDE interface: Intel Corporation 82801H (ICH8 Family) 2 port SATA IDE Controller (rev 02)
01:00.0 VGA compatible controller: nVidia Corporation G71 [GeForce 7300 GS] (rev a1)
02:00.0 PCI bridge: Intel Corporation 6702PXH PCI Express-to-PCI Bridge A (rev 09)
03:08.0 SCSI storage controller: LSI Logic / Symbios Logic SAS1068 PCI-X Fusion-MPT SAS (rev 01)
05:00.0 RAID bus controller: JMicron Technologies, Inc. JMicron 20360/20363 AHCI Controller (rev 02)
05:00.1 IDE interface: JMicron Technologies, Inc. JMicron 20360/20363 AHCI Controller (rev 02)
06:01.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)

 「EHCI」という単語が見えれば、USB2.0が使えるはずです。
 また、場合によっては

# lspci
 (途中省略)
00:1d.7 USB Controller: Intel Corporation 6300ESB USB2 Enhanced Host Controller (rev 02)


 こんな風に略号じゃなくて「Enhanced Host Controller」とか記述されることもあります。もっとも、Intelのチップセットとかだと、思いっきり「USB2」と書かれているので一瞬で判るとおもいますがね。(笑)他のベンダーだとEHCIが多いかも。

 ちなみに、UHCIとかOHCIはUSB1.1のコントローラです。EHCIが無くてUHCIかOHCI「のみ」の場合はUSB2.0は使えないでしょう。

プロセスの正確な起動日時を知りたい! [小技(Linux)]

 どこかのOSと違い、連続運用が得意なLinuxの場合、サーバが何ヶ月とか下手をすると年単位で連続稼働してたりしますね。ところが、困ったことに長生きしてるサーバなりプロセスなりをpsコマンドで「起動日時」をチェックしようものなら…

[root@server1 root]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Sep06 ?        00:00:00 init [3]
root         2     1  0 Sep06 ?        00:00:00 [migration/0]
root         3     1  0 Sep06 ?        00:15:04 [ksoftirqd/0]
root         4     1  0 Sep06 ?        00:00:00 [migration/1]
root         5     1  0 Sep06 ?        00:00:03 [ksoftirqd/1]


 とか、下手をすると

[root@server2 ~]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0  2006 ?        00:02:04 init [3]
root         2     1  0  2006 ?        00:00:07 [migration/0]
root         3     1  0  2006 ?        00:00:01 [ksoftirqd/0]
root         4     1  0  2006 ?        00:00:04 [migration/1]


 とか表示されてしまう訳ですよ。「ps aux」としても似たようなものです。

 ところが、時と場合によってはそのプロセスの正確な起動日時が知りたいんです!!ということもしばしば。そんな場合には「o」オプションの出番なんですよ奥さん。

[root@server1 root]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Sep06 ?        00:00:00 init [3]
root         2     1  0 Sep06 ?        00:00:00 [migration/0]
root         3     1  0 Sep06 ?        00:15:04 [ksoftirqd/0]
root         4     1  0 Sep06 ?        00:00:00 [migration/1]
root         5     1  0 Sep06 ?        00:00:03 [ksoftirqd/1]

 こんな表示だったサーバですと…
[root@server1 root]# ps -eo pid,ppid,lstart,cmd
  PID  PPID                  STARTED CMD
    1     0 Sat Sep  6 15:03:32 2008 init [3]
    2     1 Sat Sep  6 15:03:33 2008 [migration/0]
    3     1 Sat Sep  6 15:03:33 2008 [ksoftirqd/0]
    4     1 Sat Sep  6 15:03:33 2008 [migration/1]
    5     1 Sat Sep  6 15:03:33 2008 [ksoftirqd/1]


 ほーら。これで正確な日時が判るでしょ。「o」オプションは表示フォーマットを変更するものですが、「lstart」とだけ指定しても訳が分からなくなるだけなので、pidとかppidとかcmdとかも一緒に指定してやるとGOODなんですよ奥さん!
 ためしに「lstart」だけ書いちゃうと…

[root@server1 root]# ps -eo lstart
                 STARTED
Sat Sep  6 15:03:32 2008
Sat Sep  6 15:03:33 2008
Sat Sep  6 15:03:33 2008
Sat Sep  6 15:03:33 2008
Sat Sep  6 15:03:33 2008

 ↑こんな状態で訳わかめですお。(笑)
- | 次の10件 小技(Linux) ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。