Find duplicate UIDs in passwd

A friend recently told me of a small problem he was asked to resolve:
«Find all duplicate UIDs in your /etc/passwd file. Print them along with the associated usernames. You may use shell, perl or python».

My first, almost instant, response was the following

awk -F: '{print $1,$3}' /etc/passwd | \
sort | uniq -c | \
awk '{if ($1 > 1) {print $3, $2}}'

But using the passwd sample below, I found a bug.

root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
unbound:x:1001:1001:Un Bound,,,:/home/unbound:/bin/bash
nsd:x:1002:1002:,,,:/home/nsd:/bin/bash
nsd:x:1002:1002:,,,:/home/nsd:/bin/bash
nsd:x:1002:1002:,,,:/home/nsd:/bin/bash
insd:x:1002:1002:,,,:/home/nsd:/bin/bash

It misses the «insd» username, because it only prints out lines that contain the same uid *and* username.

So my second attempt was using perl

#!/usr/bin/perl

open(F, "</etc/passwd");
while (<F>) {
    @line = split(/:/, $_);
    $accounts{$line[2]} .= "$line[0] "; # build a hash, with uid as the key
}
close(F);

for $uid ( keys %accounts ) {
    @usernames = split(/ /, $accounts{$uid});
    if ($#usernames > 0) {
        print "$uid @usernames\n";
    }
}

Now that’s more like it :-)

Ελληνικά ή Αγγλικά;

Ρώτησε σ’ενα tweet ο @pgaval:

Νεφοπληροφορική ο προτεινόμενος από τον @sterzidi όρος για το cloud computing. Να τον κρατήσουμε;

και ο @hakmem απάντησε:

ΓΙΑΤΙ πρέπει να μεταφράζουμε κάθε όρο;


Ποτέ δεν είμουν υπέρ της μετάφρασης των πάντων στα Ελληνικά.
Οσοι είναι υπερ, παρακαλώ να σταματήσουν να διαβάζουν το περιοδικό RAM και να διαβάζουν το ΜΤΠ.

Η πρώτη κίνηση που κάνω όταν παίρνω κάτι καινούριο είναι να το γυρίσω στα Αγγλικά. Οταν ψάχνω να διαβάσω το manual, ψάχνω το Αγγλικό. Οταν βλέπω μια ταινία, ακούω τα Αγγλικά περισσότερο απ’οτι διαβάζω τους υπότιτλους. Ακόμα και ένα βιβλίο που διαβάζω αυτές τις μέρες, το οποίο είναι μετάφρασμένο στα Ελληνικά, όσο το διαβάζω προσπαθώ να καταλάβω πως το είχε γράψει ο συγγραφέας στα Αγγλικά. Δεν ξέρω αν είναι καλό ή κακό, πάντως το κάνω.

Φταίει ότι όταν ξεκίνησα να χρησιμοποιώ Η/Υ τα πάντα ήταν στα Αγγλικά; Φταίει ότι πήγα σε Αγγλικά πανεπιστήμια και έμαθα να παίρνω τη γνώση σ’αυτή τη γλώσσα; Φταίει η ποιότητα των μεταφράσεων;

Υπάρχουν πολλοί άνθρωποι που δουλεύουν για να εξελληνίσουν software/manuals/βιβλιά και δε θέλω να μειώσω τη δουλειά τους. Το σωστό είναι να κάνουν μετάφραση ή να κάνουν απόδοση όμως; Η μετάφραση είναι αντικειμενική, η απόδοση είναι υποκειμενική.

Σ’ενα  tablet pc που κοιτούσα χθες, η Ελληνική περιγραφή που είχε έλεγε ότι διαθέτει «συναγερμό» (alarm) αντί για ξυπνητήρι.
Τη λέξη «menu» τη μεταφράζουμε «εδεσματολόγιο», την αποδίδουμε «επιλογές» ή την αφήνουμε «μενού»;

Από την άλλη, αν δε δούλευαν αυτοί οι άνθρωποι τόσα χρόνια τώρα, δε θα μπορούσε ποτέ ο θείος μου (>55 χρονών, δε γνωρίζει Αγγλικά) να έχει υπολογιστή στο σπίτι και να δουλεύει άνετος χωρίς πρόβλημα. Οι μεταφράσεις που έγιναν πριν 10 χρόνια, διορθώθηκαν, ωρίμασαν, έγιναν κτήμα πολλών και αποδεκτές από τους περισσότερους.

Απο την άλλη όμως, κάποιος μου είπε οτι μια από τις χώρες με το υψηλότερο ποσοστό localization είναι η Τουρκία (citation needed). Μεταφράζουν τα πάντα, ειδικά στην τηλεόραση, γιατί αλλιώς δε θα τα έβλεπε κανείς. Αυτό καλύτερο είναι;

Automagically generate reverse from forward zones

Given a (forward) zone file, here is a quick way to automagically generate all the reverse zone files you need:

#!/usr/bin/perl
#
# does not generate PTR records for $GENERATE lines
# does not generate PTR records for CNAME and AAAA RRs
# generates PTR records for A RRs
#
%revzones = ();
$domain = $ARGV[0] || "irc.gr";
$filter = $ARGV[1] || '\S+';

open (F, "<$domain");
while (<F>) {
	next if ($_ =~ /^[;\#\$]/);
	if ($_ =~ /(\S+)[\s]+(\d+[\s]+)?IN[\s]+A[\s]($filter)/) {
		$host = $1;
		$ip = $3;
		($a, $b, $c, $d) = split (/\./, $ip);
		$revzone = "$c.$b.$a.in-addr.arpa";
		$ptr = "$d\tIN\tPTR\t$host.$domain.\n";
		$revzones{$revzone} .= $ptr;
	}
}
close (F);

open (NC, ">named.conf.rev");
foreach $revzone ( sort keys %revzones ) {
	open (R, ">$revzone");
	print R "\$INCLUDE \"soa-ns.inc\"\n";
	print R "$revzones{$revzone}";
	close (R);
	print NC "zone \"$revzone\" { type master; file \"rev/$revzone\"; };\n";
}
close (NC);

Careful as it will overwrite any existing reverse zone files you have in your current working directory.

PS. I do have one zone that generates 263 reverse zone files!

I really don’t like the underscore character!

I really don’t like the underscore [ _ ] character!

  • Please don’t use it in your hostnames, although it appears to work, it’s actually not valid and generates warnings and errors.
  • Please don’t use it in your filenames, filesystems can handle files/dirs with whitespace these days.
  • Please don’t ask ‘underscore or dash?’ when I say ‘dash’.
    If I wanted the underscore, I would say so.

ο Φάνης για ISPs

Δυο χρόνια είχα να σε δω,
και σε συνάντησα ξανά σ’ ενα ISP.
Περνούσες patches, service packs σ’ ένα θηρίο
και τα καλά σου φόραγες, σαν να’ σουν πωλητής.

Δεν ήσουνα programmer, για να πω «καλά να πάθεις»,
μα ούτε web developer, για να πω «βάλε μυαλό».
Solaris κι HP admin 2 χρόνια κι 6 μήνες,
system shutdown έκανες, και είπες «άντε γεια».

Το ξέρω, ζήτησες δουλειά σε χιλια δύο αφεντικά,
κι όλοι ζητούσανε να δουν συστάσεις, προϋπηρεσία.
Μα μόλις είδανε κι αυτοί ότι δεν ήξερες ΝΤ,
σε διώξανε σαν το σκυλί και δεν σ’ αφήσανε να πεις
μια δικαιολογία…

Και είπες στην αρχή «καλά», κι αλλού εζήτησες δουλειά.
Κι αλλού ξανά, κι αλλού τα ίδια και τα ίδια.
Μα ήσουν άτυχος πολύ, γιατί έπεσες και σ’ εποχή
που όλοι δουλεύανε ΝΤ κι εσύ είχες OpenBSD
κι’ αυτό το OS, το ξέρεις, φέρνει ανεργία.

Κι ερχόντουσαν και τα crash dumps κάθε που νύχτωνε,
σε τυραννούσαν reinstalls μέσα στο βράδυ.
Κι είναι μαρτύριο τρομερό, το βίτσιο αυτό το βρωμερό
που σου’ μαθέ το point n’ click
εκείνος ο κοντός απ’ τον Πουλιάδη.

Σου λείπει το FreeBSD, το ξέρεις πως δε φταις εσύ.
Φωτιές σου καίνε το κορμί, κουτάκι και εικόνα.
Και έκανες υπομονή, γιατί φοβόσουν τα ΝΤ,
τα λόγια μέσ’ την μοναξιά και τα mails που ερχόντουσαν
απ’ τον Exchange Server.

Μέχρι να σου βγει η ψυχή, δε θα ξεχάσεις μια στιγμή,
κάποια βραδιά που σκόνταψες πάνω στο UPS.
Κι είπανε τ’ άλλο το πρωί στο 15 το PC,
ότι βιάσανε οι παλιοί τον sysadmin τον Μήτσο

Κι όταν σε βρήκαν παγωμένο στο VT σου,
είπαν «αυτός είναι από ώρα πια νεκρός»…
Και κάποιος έτρεξε τηλέφωνο να πάρει.

Πέντε βδομάδες τώρα υπέφερες το ξέρω.
Το ξέρω, σου έλειψε το /bin/tcsh.

Και μου ‘λεγες «εκεί ξανά δεν θα γυρίσω,
βαρέθηκα blue screens κάθε λεπτό,
σαν άνθρωπος κι εγώ θέλω να ζήσω»…

Δυο χρόνια είχα να σε δω,
και σε συνάντησα ξανά σε ISP.
Περνούσες patches, service packs σ’ ένα θηρίο
και τα καλά σου φόραγες, σαν να’ σουν πωλητής.

Free Linux Journal Issue 02/2010

Είμαι συνδρομητής του Linux Journal για περίπου 10 χρόνια.. Τα τελευταία δύο, εκτός από την παραδοσιακή έντυπη έκδοση πήρα και το Digital Subscription σε PDF. Μαζί με το Linux Journal Archive CD η συλλογή μου πλέον είναι πλήρης..

Τώρα μου έμειναν ένα σωρό hard-copies του LJ που πιάνουν χώρο.. ή θα τα δώσω σε κάποιο τοπικό εργαστήριο Linux Users Group (thelug?) ή θα τα ανακυκλώσω..

Αυτό το μήνα πάντως, προσφέρουν εντελώς δωρεάν το τεύχος του Φεβρουαρίου 2010 σε PDF..

Κατεβάστε το feb2010-special.pdf και καλη ανάγνωση!

UPDATE: Πάρτε και μια γεύση του επόμενου τεύχους LJ (System Administration): http://ow.ly/16sdFz

UPDATE2: Ο @boukouvalas επικοινώνησε μαζί μου για τα hard-copies στο εργαστήριο του thelug :)