उनके पहले शब्द को छोड़कर समान लाइनें, पहले शब्द को एक चर में रखें


0

मेरे पास फ़ाइल (sudoers) है जिसमें लाइनें पहले शब्द को छोड़कर समान हो सकती हैं (विभिन्न उपयोगकर्ता कमांड के एक ही सेट को निष्पादित कर सकते हैं)। मैं कमांड का उपयोग करके ऐसी लाइन निकालने में सक्षम हूं:

# grep -v '^ *%' /etc/sudoers |egrep "$users_in_which_I_am_interested | sort|awk '{sub(/^[ \t]+/, "")};1'

tom ALL = NOPASSWD:/usr/bin/pwdadm,/usr/bin/chsec,/usr/bin/chuser   
jim ALL = NOPASSWD:/usr/bin/pwdadm,/usr/bin/chsec,/usr/bin/chuser   
mark ALL = NOPASSWD:/usr/bin/pwdadm,/usr/bin/chsec,/usr/bin/chuser  
peter ALL = NOPASSWD:/usr/bin/pwdadm,/usr/bin/chsec,/usr/bin/chuser

(/ etc / sudoers इससे पहले कि प्रमुख और अनुगामी टैब और रिक्त स्थान को निकालने के लिए तैयार किया गया है और सभी एकल स्थान के बीच कई व्हाट्सएप को प्रतिस्थापित किया गया है)। वे लाइनें उपयोगकर्ता को छोड़कर समान हैं। मैं उन पंक्तियों को निकालने में सक्षम होना चाहता हूं जिनमें समान कमांड स्टेटमेंट समान अनुमतियों के साथ कॉन्फ़िगर किए गए हैं, लेकिन अलग-अलग उपयोगकर्ता हैं, और उपयोगकर्ता नाम को एक चर में असाइन करते हैं और इसे लूप के माध्यम से चलाते हैं।

# grep -v '^ *%' /etc/sudoers |egrep "$users_in_which_I_am_interested | sort|awk '{sub(/^[ \t]+/, "")};1'| uniq -cf 1
4 tom ALL = NOPASSWD:/usr/bin/pwdadm,/usr/bin/chsec,/usr/bin/chuser

मेरे लिए समस्या यहाँ आती है - फ़ाइल में सभी पंक्तियों को कैसे ढूंढें, जिसमें समाहित हैं

"ALL = NOPASSWD:/usr/bin/pwdadm,/usr/bin/chsec,/usr/bin/chuser"

और उपयोगकर्ता को उन लाइनों में एक चर के लिए असाइन करें? "grep"-स्ट्रिंग के लिए आसानी से संभव नहीं है, यह एक अज्ञात स्ट्रिंग है और इसमें कई वर्ण शामिल हो सकते हैं जिन्हें बचाना पड़ता है। ksh, awk और sed का उपयोग किया जा सकता है (कोई पर्ल / पायथन और अन्य स्क्रू। भाषाएँ)।

जवाबों:


1
awk '
  {user = $1; $1 = ""; users[$0] = users[$0] sep user; sep = " "}
  END {for (key in users) {print key ">" users[key]}}
'

आपके नमूना इनपुट को देखते हुए, यह उत्पादन करता है

 ALL = NOPASSWD:/usr/bin/pwdadm,/usr/bin/chsec,/usr/bin/chuser>tom jim mark peter

यह हमेशा मुझे आश्चर्यचकित करता है कि आप
जाग के

0

मुझे पता है कि आप एक पर्ल समाधान नहीं चाहते थे, लेकिन यहां एक है। इसका लाभ यह है कि यह अनुमति दे सकता है यदि अनुमत कमांड अलग क्रम में हैं।

तो
NOPASSWD:/usr/bin/pwdadm,/usr/bin/chsec,/usr/bin/chuser
इसके बराबर माना जाता है
NOPASSWD:/usr/bin/chuser,/usr/bin/pwdadm,/usr/bin/chsec

#!/bin/perl
use strict;
use warnings;

my %hash;

# reads all lines from STDIN
while(<>) {
    chomp;  # removes leading/trailing whitespace

    #splits the input string on whitespace
    my ($user, undef, undef, $cmds) = split;    

    # pulls out list of allowed commands
    my($NP, $cmdlist) = split(/:/, $cmds);

    # Sorts the list of commands and puts it together again
    $cmds = "$NP:".join(',', sort split(/,/, $cmdlist));

    # if the command exists in the hash with a user
    # add the nest user else just adds user                      
    $hash{$cmds} = $hash{$cmds}? "$hash{$cmds} $user" : $user;
}

# print all                                          
foreach my $key (keys %hash) {
    print "$key | ", $hash{$key} ,"\n";
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.