"alien some-package.rpm"でディレクトリが作成できないと怒られるときは

alienコマンドの謎のエラー(?)

"*.rpm"をNFS Exportされた/homeとかに置いた状態でalienを実行していると、下記のように怒られる場合があります。

root@some-pc:/home/babydaemons# alien gnush_v0903_elf-1-1.i386.rpm
Warning: Skipping conversion of scripts in package gnush_v0903_elf: postinst postrm
Warning: Use the --scripts parameter to include the scripts.
mkdir: ディレクトリ `gnush_v0903_elf-1' を作成できません: Permission denied
unable to mkdir gnush_v0903_elf-1:  at /usr/share/perl5/Alien/Package.pm line 257.

とりあえず、下記の姑息な手段で逃げましたが。

root@some-pc:/home/babydaemons# cp gnush_v0903_elf-1-1.i386.rpm /tmp; cd /tmp; !!

原因を調べてみる

/usr/share/perl5/Alien/Package.pmの257行めあたりを見てみると、

=item unpack

This method unpacks the package into a temporary directory. It sets
unpacked_tree to point to that directory.

(This is just a stub method that makes a directory below the current
working directory, and sets unpacked_tree to point to it. It should be
overridden by child classes to actually unpack the package as well.)

=cut

sub unpack {
        my $this=shift;

        my $workdir = $this->name."-".$this->version;
        $this->do("mkdir $workdir") or
                die "unable to mkdir $workdir: $!";
        # If the parent directory is suid/sgid, mkdir will make the root
        # directory of the package inherit those bits. That is a bad thing,
        # so explicitly force perms to 755.
        $this->do("chmod 755 $workdir");
        $this->unpacked_tree($workdir);
}

てな感じで、


This is just a stub method that makes a directory below the current working directory
だそうで、

カレントディレクトリに書き込み権限が必要だよーん
ということになります。

root様はどこでも書けちゃうんじゃないの?

と思いがちですが、/etc/exportsで明示的に許可しない限り、NFS clientからはroot権限で書き込みできません。理由がclientがsetuidなバイナリ・スクリプトを置けちゃうとセキュリティホールになるからです。

root@student-pc:/home/student# df .
Filesystem           1M-blocks      Used Available Use% Mounted on
professor-pc:/home       2016M      309M     1605M  17% /home
root@student-pc:/home/student# cp -p /bin/sh .
root@student-pc:/home/student# chowm root ./sh
root@student-pc:/home/student# chmod s+rwx ./sh
root@student-pc:/home/student# ^D
student@student-pc:~$ ssh professor-pc
student@professor-pc:~$ ./sh

ところで、

Ubuntuだからsudo使えよ>俺