Benutzer ermitteln

T

tw-elektric

Eroberer
Hallo zusammen,
ich versuche gerade einen Script zu erstellen, mit welchem ich auf 10 Rechnern auf einmal einen Ordner erstelle und die Rechte vergebe.

Code:
set echo
mkdir /tw-elektric
chgrp cam /tw-elektric
chown `whoami` /tw-elektric

Nun habe ich das Problem, dass ich mit `whoami` ja den Buntzer Root herausbekomme, es sollte aber der normale Benutzer sein. Wie bekomme ich hier am Besten den Butzername rein, der angemeldet ist?

Danke
Gruß

Ottscho
 
erm, whoami zeigt dir den benutzer an, unter welchem das skript ausgeführt wurde. who sollte dir alle angemeldeten benutzer zeigen. (wobei der xserver ja unter root läuft und ich root dort nicht finden kann, von daher stimmt das vielleicht doch nicht so ganz, kA..)
 
who zeigt mir folgendes unter root:
Code:
TW80:~> su
Password: 
root@TW80:/home/ottbe# who
ottbe    tty7         2008-03-13 11:58 (:0)
ottbe    pts/0        2008-03-13 12:00 (:0.0)
ottbe    pts/1        2008-03-13 12:00 (:0.0)
ottbe    pts/2        2008-03-13 12:42 (:0.0)

nun wäre ottbe das richtige. mache ich das ganze auf einem anderen rechner:
Code:
TW80:~> ssh 192.92.130.172 -l root
root@192.92.130.172's password: 
Last login: Mon Mar 10 16:18:03 2008 from edvgenesis.local
Linux tw87 2.6.22-14-generic #1 SMP Tue Feb 12 07:42:25 UTC 2008 i686

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
root@tw87:~# who
louis    tty7         2008-03-13 09:31 (:0)
louis    pts/0        2008-03-13 09:31 (:0.0)
louis    pts/1        2008-03-13 11:32 (:0.0)
root     pts/2        2008-03-13 12:44 (tw80.local)
root@tw87:~#
nun wäre louis das was ich benötige. sprich, tty7 bringt das ergebnis, welches ich gerne hätte. nur wie bekomme ich jetzt aus dem ganzen nur den benutzer "louis" oder "ottbe" heraus?

Danke
 
hm, ich dachte der xserver (der ja auf tty7 läuft) würde von root gestartet werden. vielleicht sind meine informationen auch veraltet. hm, wenn der "normale" benutzer immer der ist, der auf tty7 (x) angemeldet ist, könnte man das ja einfach so machen:
Code:
who|awk '{if ($0 ~ /tty7/) print $1}'
das durchsucht die jeweilige zeile nach dem string tty7 (eigentlich eine regex, aber es werden keine regex "erweiterungen" benutzt, es kommt quasi einer string-suche gleich..) und gibt dann das erste feld aus, wobei das erste feld hier der benutzer ist. felder sind per default durch leerzeichen getrennt in awk.
wobei das ja irgendwie auch davon abhängig ist, dass ein xserver läuft, oder? kA, was definiert denn eigentlich für dich einen "normalen" benutzer?

also ich hör jetzt mal lieber auf hier wild "lösungen" zu versprühen, nachher verletzt sich noch jemand :X
 
funktioniert bestens :) vielen dank...
es ist so, die user kommen morgens und melden sich am rechner (ubuntu) mit dem username an. dieser besteht in der regel aus nachname und ersten zwei buchstaben des vornamens. nun sind es ca. 10 client, und ich muss des öfteren änderungen vornehmen. so wie jetzt, nämlich einen neuen ordner erstellen, rechte setzten und dann später in der fstab noch einen nfs eintrag erstellen.

nun habe ich die möglichkeit mit m23server scripte zu verteilen und auf den clients als root auszuführen :D
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

jetzt stehe ich wieder auf dem schlauch... mache ich das ganze unter dem user:
Code:
TW80:~> set test = `who | awk '{if ($0 ~ /tty7/) print $1}'`
TW80:~> echo $test
ottbe

funktionert es so wie ich möchte.
und wenn ich root bin, funktioniert der befehl, aber nicht dass in eine variable schreiben:
Code:
TW80:~> su
Password: 
root@TW80:/home/ottbe# set test = `who | awk '{if ($0 ~ /tty7/) print $1}'`
root@TW80:/home/ottbe# echo $test

root@TW80:/home/ottbe# who | awk '{if ($0 ~ /tty7/) print $1}'
ottbe
root@TW80:/home/ottbe#

muss ich unter root was beachten?
 
Zuletzt bearbeitet:
wer zwingt dich eigentlich set zu benutzen?
Code:
foo=$(echo 'ich bin der output eines echo-kommandos')
bar=`echo 'ich auch'`
....
funktioniert hier... (gnu bash)
 
ich habe nicht die normale bash, sonder csh ;)
so viel ich weiß, brauche ich da SET.
 
sry, habe ich nicht gelesen. habe es eben schnell überflogen, aber
nun habe ich nichts gefunden, warum der Befehl
Code:
set username = `who | awk '{if ($0 ~ /tty7/) print $1}'`

unter dem User geht, und unter root nicht. Hat mir jmd einen Tipp heute morgen?

Danke
Gruß

tw-elektric

edit... ich habe es gelöst. mir ist eben aufgefallen, dass der root user unter der bash arbeitet und der benutzer unter der csh... sorry.

Danke, gruß TW
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

oh man, ich tue mich so verdammt schwer, mit diesen shell scripten.
ich möchte nun anschließend nach der Ordnererstellung einen Eintrag in die fstab editieren:
Code:
sed 's/#  SRV01  #\r\n###########/#  SRV01  #\r\n###########/\r\n\/\/192.92.130.20\/tw-elektric	\/tw-elektric	cifs	auto,username=$username,password=genesis,uid=$username,gid=cam	0	0/g' /etc/fstab

Fehler:
sed: -e Ausdruck #1, Zeichen 57: unknown option to `s'

Habe ich nun ein Problem mit den vielen /\ etc. oder ist der SED Befehl einfach nur falsch?
Sollte doch so sein:
sed 's/to_be_replaced/replaced/g' dateiname.txt

Danke für eure Hilfe.
Gruß
TW
 
Zuletzt bearbeitet:
Hallo
Das wäre ein neuer Thread gewesen.

Wie du siehst, ist die verwendete Shell schon von Bedeutung. ;)

Dein sed Befehl ist auf jeden Fall falsch.
Was bitte möchtest du denn durch was ersetzen?

Das kann ich deinem Versuch nämlich nicht entnehmen.

Wolfgang
 
folgendermaßen sieht meine fstab aus:
Code:
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
# /dev/sda1
UUID=c9344608-f2c1-4ff1-918c-a6be4c93befc /               ext3    defaults,errors=remount-ro 0       1
# /dev/sda5
UUID=58d09d30-9e1b-4d1b-98cc-49aca2744adf none            swap    sw              0       0
/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto,exec 0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec 0       0

#############
#  SRVLX01  #
#############
192.92.130.19:/mnt/iscsi0/genesis	/genesis	nfs	rsize=8192,wsize=8192	0	0
192.92.130.19:/mnt/iscsi0/dbs_genesis	/dbs_genesis	nfs	rsize=8192,wsize=8192	0	0

################
#  CAM-Server  #
################
192.92.130.21:/mnt/raid	/work/twraid	nfs	defaults	0	0
192.92.130.21:/mnt/raid2/Archiv	/work/Archiv	nfs	defaults	0	0
192.92.130.21:/mnt/raid3	/mnt/raid3	nfs	defaults	0	0

#############
#  SRV2003  #
#############
//192.92.130.12/Client	/wdsoft	cifs	auto,username=fehrenbachch,password=genesis	0	0

###########
#  SRV01  #
###########
//192.92.130.20/Genesis	/cam	cifs	auto,username=fehrenbachch,password=genesis	0	0
//192.92.130.20/Produktionsdaten	/produktionsdaten	cifs	auto,username=fehrenbachch,password=genesis	0	0

###EOF###

nun möchte ich unter dem
###########
# SRV01 #
###########
einen neuen Eintrag eingefügt wird.
und zwar dieser hier:
Code:
//192.92.130.20/tw-elektric	/tw-elektric	cifs	auto,username=$username,password=genesis,uid=$username,gid=cam	0	0
 
Der Fehler wird verursacht von
Code:
sed 's/#  SRV01  #\r\n###########/#  SRV01  #\r\n###########[COLOR="Red"]/[/COLOR]\r\n\/\/192.92.130.20\/tw-elektric	\/tw-elektric	cifs	auto,username=$username,password=genesis,uid=$username,gid=cam	0	0/g' /etc/fstab
(rot markiert das muss da weg)

Allerdings weiß ich nicht, wie man $to_be_replaced mit Zeilenumbrüchen angibt (bei mir klappt das so nicht).
$replaced ist bis auf Variablen die in einfache Anführungszeichen gesetzt werden müssen ok.
Also aus $username mach '$username' und
Code:
sed 's/to_be_replaced/replaced/[COLOR="Red"]g[/COLOR]'
das g am Ende wird nur gebraucht, wenn mehrere Ersetzungen durchgeführt werden sollen.
Als letzte Anmerkung noch. Wenn die Ersetzung gleich in die Datei geschrieben werden soll, muss es heißen sed -i ... sonst wirds nur in der Shell ausgegeben.
 
Du kannst quasi jedes Zeichen als Trennzeichen nehmen (der Übersichtlichkeit zur Liebe..). So würde es in perl gehen:
Code:
perl -pe 'undef $/;s|SRV01  #\n###########|$&\n//192.92.130.20/tw-elektric/tw-elektriccifsauto,username=$username,password=genesis,uid=$username,gid=cam00|s' /etc/fstab
In sed weiß ich grade nicht, wie man den "single-line" mode anstellt, beziehungsweise bin zu faul zum Suchen. (Kannst du ja auch, ein Tip: man sed)

Edit: hmpf, das singleline-flag braucht man hier auch gar nicht, weil sich das nur auf das "Verhalten" vom Punkt (matcht dann auch newlines) auswirkt...
 
Zuletzt bearbeitet:
Also mit sed 'N;s/... gehts.
Code:
sed -i 'N;s/#  SRV01  #\n###########/#  SRV01  #\n###########\n\/\/192.92.130.20\/tw-elektric	\/tw-elektric	cifs	auto,username='$username',password=genesis,uid='$username',gid=cam	0	0/' /etc/fstab
 
Zuletzt bearbeitet:
Hm,
man sed schrieb:
n N Read/append the next line of input into the pattern space.
Ich bin mir nicht sicher, aber ich glaube, dann hat man immer zwei Reihen zusammen. Das müsste heißen, dass immer die erste und zweite "gejoint" werden, die dritte und vierte etc.
Afaik. Das sollte man vielleicht noch wissen. Wobei man natürlich sooft "N" ausführen kann wie man will/lustig ist...

Und mein Kommando sollte man besser auch so schreiben:
Code:
perl -pe 'BEGIN {undef $/} s|SRV01  #\n###########|$&\n//192.92.130.20/tw-elektric/tw-elektriccifsauto,username=$username,password=genesis,uid=$username,gid=cam00|' /etc/fstab
Dann gilt das "neue" $/ schon ab "Zeile 1"..

Und ein Trennzeichen jenseits des slashes empfiehlt sich auch für sed, wenn man so viele slashes benutzt...

[Edit]: Ich weiß jetzt nicht, wie klar das geworden ist, aber das hier:
Das müsste heißen, dass immer die erste und zweite "gejoint" werden, die dritte und vierte etc.
bedeutet letztlich, dass das Kommando nur funktioniert, wenn die erste Zeile der match-regex ungerade ist (was sie hier ist: Zeile 31). Wenn sie gerade ist funktioniert das Kommando so nicht mehr. (Man füge irgendeine Zeile vor "# SRV01 #" ein und schon funktioniert es nicht mehr..) Deswegen am Besten die erste Zeile matchen und dann "N" ausführen (und damit die nächste Zeile mit dem aktuellen "patternspace" joinen) und danach erst den s-Befehl. Außerdem kennt sed auch die "&" Variable. (Beziehungsweise vielleicht hat perl die sogar von da "übernommen"..)
Code:
sed -e '/#  SRV01  #/N;s|#  SRV01  #\n###########|&\n//192.92.130.20/tw-elektric/tw-elektriccifsauto,username='$username',password=genesis,uid='$username',gid=cam00|' /etc/fstab
 
Zuletzt bearbeitet:
danke für eure Antworten.
Jetzt muss ich dies alles mal in Ruhe durchlesen und ausprobieren.
Bin noch ein Neuling in Sachen Shellprogrammierung und die Sachen fallen mir im Moment noch sehr sehr schwer...

Ich geb später Bescheid.

Danke
Gruß
TW
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

so, ich habe es nun so gemacht:
Code:
sed -i 's/###EOF###/\/\/192.92.130.20\/tw-elektric	\/tw-elektric	cifs	auto,username='$username',password=genesis,uid='$username',gid=cam	0	0\r\n\###EOF###/' /home/ottbe/Desktop/fstab

ich schreibe es nun einfach ganz unten in die FSTAB, als letzter Eintrag vor das ###EOF###. Das mit der Suche nach ##SRV01## hat nicht funkoniert, aber ist mir nun auch egal :D

sieht alles ganz gut aus, aber ich habe die TABS nicht. Gibt es ein Zeichen für ein TAB? So wie \r\n für Linefeed etc.?

Danke
Gruß

TW
 
Zuletzt bearbeitet:
Hallo
Dein \r\n ist Windows-like Zeilenende.
Unter Unix/Linux hat das nix zu suchen.
Tabulator: \t

Zu dem Problem:
Das hier funktioniert mit GNU sed tadellos:
Code:
sed -i -e '/SRV01/{N;s!.*!&\n//192.92.130.20/tw-elektric\t/tw-elektric\tcifs\tauto,username=$username,password=genesis,uid=$username,gid=cam\t0\t0!}' /etc/fstab

Trotzdem bitte beim nächsten mal einen eigenen Thread erstellen.
Das passt nähmlich so nicht mit dem Betreff zusammen.

Und andere User wollen ja auch noch etwas thematisch finden!

Wolfgang
 
danke für die AW.
Nun sollte es gehen :)


Gruß
TW
 

Ähnliche Themen

HandbrakeCLI Shell Skript

PHP in Verbindgung mit Shellcode

Samba Ordner&Rechte struktur Hilfe!

Nutzerrechte in Samba 3.2

Server-Monitoring mit RRDTool

Zurück
Oben