2done.org

Linuxメインなメモ書き。二度寝してから書く。(ご意見は Twitter あたりで。そのうちコメント欄つけます。)

ls -lZ と ls -Zl の結果が違う件について

何か良く分からないものにまた追加(2011/05/13)

環境

概要

ls -lZ と ls -Zl の結果が異なる。

経緯

いつもファイルコンテキストを確認すると際はいつも ls -Z としています。

これが ls -lZ の結果と同じ結果を得ることを知っており、いつも -l を省略していました。

出力例

# ls -Z /
dr-xr-xr-x. root root system_u:object_r:bin_t:s0 bin
dr-xr-xr-x. root root system_u:object_r:boot_t:s0 boot
drwxr-xr-x. root root system_u:object_r:cgroup_t:s0 cgroup
drwxr-xr-x. root root system_u:object_r:device_t:s0 dev
drwxr-xr-x. root root system_u:object_r:etc_t:s0 etc
drwxr-xr-x. root root system_u:object_r:home_root_t:s0 home
dr-xr-xr-x. root root system_u:object_r:lib_t:s0 lib
drwx------. root root system_u:object_r:lost_found_t:s0 lost+found
drwxr-xr-x. root root system_u:object_r:mnt_t:s0 media
drwxr-xr-x. root root system_u:object_r:mnt_t:s0 mnt
drwxr-xr-x. root root system_u:object_r:usr_t:s0 opt
dr-xr-xr-x. root root system_u:object_r:proc_t:s0 proc
dr-xr-x---. root root system_u:object_r:admin_home_t:s0 root
dr-xr-xr-x. root root system_u:object_r:bin_t:s0 sbin
drwxr-xr-x. root root system_u:object_r:security_t:s0 selinux
drwxr-xr-x. root root system_u:object_r:var_t:s0 srv
drwxr-xr-x. root root system_u:object_r:sysfs_t:s0 sys
drwxrwxrwt. root root system_u:object_r:tmp_t:s0 tmp
drwxr-xr-x. root root system_u:object_r:usr_t:s0 usr
drwxr-xr-x. root root system_u:object_r:var_t:s0 var

# ls -lZ /
dr-xr-xr-x. root root system_u:object_r:bin_t:s0       bin
dr-xr-xr-x. root root system_u:object_r:boot_t:s0      boot
drwxr-xr-x. root root system_u:object_r:cgroup_t:s0    cgroup
drwxr-xr-x. root root system_u:object_r:device_t:s0    dev
drwxr-xr-x. root root system_u:object_r:etc_t:s0       etc
drwxr-xr-x. root root system_u:object_r:home_root_t:s0 home
dr-xr-xr-x. root root system_u:object_r:lib_t:s0       lib
drwx------. root root system_u:object_r:lost_found_t:s0 lost+found
drwxr-xr-x. root root system_u:object_r:mnt_t:s0       media
drwxr-xr-x. root root system_u:object_r:mnt_t:s0       mnt
drwxr-xr-x. root root system_u:object_r:usr_t:s0       opt
dr-xr-xr-x. root root system_u:object_r:proc_t:s0      proc
dr-xr-x---. root root system_u:object_r:admin_home_t:s0 root
dr-xr-xr-x. root root system_u:object_r:bin_t:s0       sbin
drwxr-xr-x. root root system_u:object_r:security_t:s0  selinux
drwxr-xr-x. root root system_u:object_r:var_t:s0       srv
drwxr-xr-x. root root system_u:object_r:sysfs_t:s0     sys
drwxrwxrwt. root root system_u:object_r:tmp_t:s0       tmp
drwxr-xr-x. root root system_u:object_r:usr_t:s0       usr
drwxr-xr-x. root root system_u:object_r:var_t:s0       var

ところが、ls -Zl としたところ、結果が異なることがわかりました。

出力例

# ls -Zl /
合計 82
dr-xr-xr-x.  2 system_u:object_r:bin_t:s0       root root  4096 2011-05-06 07:55 bin
dr-xr-xr-x.  5 system_u:object_r:boot_t:s0      root root  1024 2011-05-12 09:23 boot
drwxr-xr-x.  2 system_u:object_r:cgroup_t:s0    root root  4096 2011-03-03 18:08 cgroup
drwxr-xr-x. 17 system_u:object_r:device_t:s0    root root  3560 2011-05-13 06:15 dev
drwxr-xr-x. 65 system_u:object_r:etc_t:s0       root root  4096 2011-05-13 06:14 etc
drwxr-xr-x.  3 system_u:object_r:home_root_t:s0 root root  4096 2011-05-12 10:57 home
dr-xr-xr-x. 16 system_u:object_r:lib_t:s0       root root 12288 2011-05-06 07:55 lib
drwx------.  2 system_u:object_r:lost_found_t:s0 root root 16384 2011-05-06 07:19 lost+found
drwxr-xr-x.  2 system_u:object_r:mnt_t:s0       root root  4096 2010-04-20 01:31 media
drwxr-xr-x.  2 system_u:object_r:mnt_t:s0       root root  4096 2010-04-20 01:31 mnt
drwxr-xr-x.  2 system_u:object_r:usr_t:s0       root root  4096 2010-04-20 01:31 opt
dr-xr-xr-x. 82 system_u:object_r:proc_t:s0      root root     0 2011-05-13 15:11 proc
dr-xr-x---.  6 system_u:object_r:admin_home_t:s0 root root  4096 2011-05-13 06:23 root
dr-xr-xr-x.  2 system_u:object_r:bin_t:s0       root root  4096 2011-05-06 07:55 sbin
drwxr-xr-x.  7 system_u:object_r:security_t:s0  root root     0 2011-05-13 15:11 selinux
drwxr-xr-x.  2 system_u:object_r:var_t:s0       root root  4096 2010-04-20 01:31 srv
drwxr-xr-x. 12 system_u:object_r:sysfs_t:s0     root root     0 2011-05-13 15:11 sys
drwxrwxrwt.  3 system_u:object_r:tmp_t:s0       root root  4096 2011-05-13 06:27 tmp
drwxr-xr-x. 12 system_u:object_r:usr_t:s0       root root  4096 2011-05-06 07:27 usr
drwxr-xr-x. 18 system_u:object_r:var_t:s0       root root  4096 2011-05-06 08:00 var

調査結果

原因は -Z オプションを追加する coreutils-selinux.patch にありました。

ls はオプションによって表示フォーマットを決定しています。

coreutils-8.5-7.f14 の ls の format は以下の通りです。

件のオプションを指定した場合は以下のようになります。

format の値がが異なるため、その後の処理に差が出ます。

    case long_format:
      for (i = 0; i < cwd_n_used; i++)
        {
          set_normal_color ();
          print_long_format (sorted_file[i]);
          DIRED_PUTCHAR ('\n');
        }
     break;
    case security_format:
      for (i = 0; i < cwd_n_used; i++)
      {
        print_scontext_format (sorted_file[i]);
        DIRED_PUTCHAR ('\n');
      }

long_format の処理は、-Z オプションが有効な場合の処理が含まれているようです。

  if (print_scontext)
    {
      sprintf (p, "%-32s ", f->scontext ? f->scontext : "");
      p += strlen (p);
    }

しかし、security_format の場合は context だけを表示し、-l を無視します。

仕様と言われればそうなのかもしれませんが、-l が無視されているのでバグではないかと考えています。

こういうのは何処に聞けばいいんでしょうか。どなたか教えてください。。

追記(2012/07/26)

Red Hat の藤田さんにバグとして挙げて頂きました。

https://bugzilla.redhat.com/show_bug.cgi?id=771843

そして解消したようです。

http://rhn.redhat.com/errata/RHBA-2012-0933.html

と、思ったら info ls に注意書きがたされただけだったああああああ・・・