2016-10-11 11 views
-1

例:ここ$gidパイプコマンドの入力としてperlの変数を使用するには?

foreach $gid (sort (keys %list)){ 
    if ($list{$gid} >= $count){ 
     print "$list{$gid} ---> "; 
     print "$gid ---> "; 
     system(getent group | grep -w ^$gid | awk -F: '{printf $0 } '); 
    } 
} 

**は、私は、システムのcommmand内を検索し、印刷されたそのコマンドの最初の部分を取得したい値を含む変数です。

+1

主な問題perlですべてをやることができるときに 'system()'を使うのはなぜですか? –

+0

私は真珠が直接使用できることを知りませんでした。ありがとうございました! –

答えて

0

systemは文字列をとるので、補間を他の場所で使用してください。

system("getent group | grep -w ^$gid | awk -f: '{printf \$0}'"); 

(あなたはsystemに文字列を渡す前$0の拡大からPerlを防ぐためにawkコマンドで$をエスケープする必要があります。)

+1

しかし、確かに最も安全なアプローチではありません。環境から引数を渡して、シェルがそれらを解釈できるようにする方がよいでしょう。あるいは、シェルのargvに渡される明示的な文字列として、悪意のあるキーがリストに存在するとシェル注入攻撃の可能性を避けてください。 –

+0

渡す前に '$ gid'を検証できます。この場合、有効なグループ名であることを確認するだけで済みます。 – chepner

+0

あなたのコードがPOSIXよりも多くのグループ名を許可しないシステムでのみ実行される場合は、有効であることを確認してください。しかし、cygwinでは、ユーザ名やグループ名はスペース(f'rinstance)で囲まれており、実際には起こります。 –

3

ここにシェルアウトする理由はありません。グループIDのグループ名が必要なようです。 Perlの組み込みgetgrgid()機能に容易GIDに渡すことであることを処理することができます:

for my $gid (sort (keys %list)){ 
    if ($list{$gid} >= $count){ 
     print "$list{$gid} ---> "; 
     print "$gid ---> "; 
     my $name = getgrgid($gid); # <-- here 
     print "** $name **\n"; 
    } 
} 
+0

これは正常に動作しています!もう一つ問題があります。同じGIDを持つ2つのグループがある可能性があります。その違いは、1つのグループに最後の列が空になり、もう1つのグループに少なくとも1つのメンバーがあることです。このコマンドは、NULLレコードを取り出します。 nullでないメンバーグループを確認するにはどうすればよいですか? –

+1

Re "*同じGIDを持つ2つのグループがある可能性があります。"、いいえ、グループIDは一意です。 – ikegami

+0

%getentグループ| #voice:x​​:22: grad:*:22:abrun –

3

むしろ、適切な正規表現を含む適切なシェルコマンドを構築しようと、それが提供するCライブラリコールを使用するように簡単です。

あなたが望むものは不明です。 $gidはあなたがグループのIDを持っているように聞こえますが、^$gidはあなたがグループの名前を持っているように見えます。それで、私は2つの答えを出しました。


あなたはグループのIDを持っていて、その名前をしたい場合は、グループの名前を持っていて、そのIDを望む、

my $name = 'root'; 

while (my ($this_name, $this_id) = (getgrent())[0,2]) { 
    if ($this_name eq $name) { 
     print("$this_id\n"); 
     last; 
    } 
} 

場合は、

my $id = 0; 

my $name = getgrgid($id); 
print("$name\n"); 
関連する問題