Wie du schon vermutest, liegt das an den Rechten der Dateien.
Ein ls -al in dem Verzeichnis zeigt es an, vermutlich gehören sie root.
Was spricht dagegen, sie von root löschen zu lassen?
Per cronjob oder logrotate.
Wie du schon vermutest, liegt das an den Rechten der Dateien.
Ein ls -al in dem Verzeichnis zeigt es an, vermutlich gehören sie root.
Was spricht dagegen, sie von root löschen zu lassen?
Per cronjob oder logrotate.
Wenn man ein Terminal sehen will, muss man auch ein Terminal aufrufen. Woher soll denn das aufgerufene Programm denn wissen, wo es die Ausgabe hinschreiben soll.
Also mal mit dem guten alten xterm versuchen, dass tausende Parameter kennt:
xterm -hold -e Programmaufruf
-holt muss sein, weil das Terminal sonst sofort wieder verschwindet.
Good luck
Bei ähnlichen Problemen bis die eigentliche Lösung gefunden wird: automatisch regelmäßig löschen.
Der Eintrag in der crontab
löscht jeden Tag um 12:00 Uhr alle Dateien, die im Verzeichnis /var/log/kernel älter als 3 Tage sind.
Uhrzeit, Verzeichnis u.a. anpassen.
es muss nicht zwingend eine Datei sein, es können auch viele kleine Dateien erzeugt werden.
Mal nach einiger Zeit eine 2. Datei mit allen Dateien erzeugen und mit diff vergleichen.
Andere Möglichkeit ist mit find zu arbeiten
z.B. find /var -cmin 1 2>/dev/null
Dann werden alle Dateien ab /var gefunden, die in der letzten Minute verändert wurden.
echo {1:-500}
weist der der Variablen 1 keinen Wert zu. Die Zeile gibt 500 aus, wenn kein Parameter übergeben wurde.
mal testen mit
Edit, weil fast vergessen:
Die Shell kennt keine Typisierung
var1=12
var2=12.3
var3=12,3
eine davon ist keine Zahl
man lernt ja nie aus.
Aber das Geheimnis sind nicht die geschweiften Klammern (in meinem Beispiel sind sie auch).
Es ist das Minus-Zeichen.
Zum Ausprobieren
Mal mit , mal ohne Paramter ausprobieren.
./test.bash ->
./test.bash: Zeile 3: $1: Kann so nicht zuweisen.
- 100
+
./test.bash 200 ->
= 200
- 200
+ 100
Bis zum nächsten Mal
Es gibt ja bei Linux immer die schönen ls-Befehle, lsdev, lspci etc.
Da im Pi nicht so viel Hardware verbaut ist, gibt es davon weniger.
Hier aber schon:
lsusb
unplugged:
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Steckt irgendwas drin, ändert sich die Ausgabe (hier ein USB-Stick):
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 13fe:5000 Kingston Technology Company Inc.
Weitere Information gibt auch
dmesg
Ich bin klammheimlich davon ausgegangen, dass nur Windows-Freigaben benötigt werden. Ob ein PDC zuhause dann weniger Arbeit macht? keine Ahnung.
Aber wenn es Spaß macht, natürlich immer erlaubt.
Beschreibungen dazu gibt haufenweise im Netz, z.B.
http://wiki.ubuntuusers.de/Samba_Server_PDC
Was natürlich (noch) nicht geht, ist eine Active-Diretory-Domäne zu betreiben. Das geht erst mit Samba 4.
Samba funktioniert auf dem Pi problemlos.
Außer samba musste ich etwas zusätzlich installieren (habe ich schon wieder vergessen)
Installiert ist: samba, samba-common, samba-tools
Der Rest kommt von alleine.
Zum Schluss noch /etc/samba/smb.conf anpassen.
Z.B. so:
[global]
workgroup = THIDREK
server string = "Die Himbeere"
map to guest = Bad User
obey pam restrictions = Yes
pam password change = Yes
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
unix password sync = Yes
syslog = 0
log file = /var/log/samba/log.%m
max log size = 1000
dns proxy = No
wins support = Yes
usershare allow guests = Yes
panic action = /usr/share/samba/panic-action %d
idmap config * : backend = tdb
domain logons = No
domain master = Yes
[Daten]
path = /mnt/rubus/Daten
read only = No
inherit acls = Yes
[www]
path = /mnt/rubus/www
read only = No
inherit acls = Yes
[media]
path = /media
read only = No
inherit acls = Yes
Alles anzeigen
Es sind 3 Freigaben eingerichtet. Zugreifen kann ich mit Win XP/7/8 und Linux.
Fast vergessen: Natürlich müssen noch user für die Freigaben eingerichtet werden.
meinst du vielleicht
echo ${variable:=xyz}
Mit einer selbst definierten Variablen funktioniert das.
Aber nicht mit den Variablen mit fester Bedeutung wie $1 etc.
Für dein Vorhaben nimm das Beispiel von framp als Vorlage.
Zitat
bash Variablen muessen mit einem Alpha oder Underscore beginnen
aber ups, im Beispiel heißen die Variablen # und 1
ja, ich weiß
$0 ist der Programmaufruf
$1, $2, ... sind die Parameter 1, 2 usw.
$# zeigt die Anzahl der Parameter an.
sicher gehen Zahlen, mit 16#1A oder 0x1A (bash) hast du sogar die Hexadezimal-Zahl 1A.
fehler von eiermann1 war der Doppelpunkt.
warum denn überhaupt zwei nahezu identische Scripte.
Starte doch ein script, das einfach nur das Ergebnis des ersten jobs in eine andere Datei sichert.
Kein großer Aufwand und job1 und job2 kommen sich nicht in die Quere.
Variablen sind sind nur in der shell gültig, in der sie definiert wurden. Wird die shell beendet, sind sie weg.
Braucht man permanente Variablen, so muss man sie in Dateien schreiben und sie dann wieder auslesen.
Entweder, du denkst dir selbst aus, wie die Dateien heißen und wo sie gespeichert sind.
Oder du verwendest Dateien, die eh verwendet werden.
Wenn du im script nicht sagst, welche shell du verwenden willst, dann wird die shell sh verwendet.
Da über cron keine Login-Shell gestartet wird, funktioniert /etc/profile und ~/.profile nicht.
-> also eigene Dateien verwenden.
Steht in der ersten Zeile des Scriptes
#!/bin/bash
wird die bash-Shell verwendet. Dann wird die ~/.bashrc ausgelesen und du kannst hier Variablen setzen.
Veränderst du aber die Werte der Variablen in deinem Script, dann nimm lieber speziell für dein Script angelegte Dateien
Für USB-Platten ist das automatische Einbinden das Einfachste.
Und im Sicherungsscript kann man dann ein am Ende ein umount einbauen.
Bei NAS-Platten oder anderen Ressourcen auf anderen Rechner, muss man aber nachschauen, ob alles (noch) da ist, der Serverdienst (nfs, cifs) da ist etc.
Das Script und die Aufgabenliste habe mal angehängt.
In der crontab steht dann
@reboot sleep 10;/opt/rubus-tools/heartbeat.bash > /dev/null 2>&1
*/5 * * * * /opt/rubus-tools/heartbeat.bash > /dev/null 2>&1
Die entsprechenden Verzeichnisse zum mounten müssen vorhanden sein.
Ich verwende das Schema
/mnt/"Rechnername"/"Freigabename"
Viel Spaß beim Lesen
Aufgabenliste:
#
# Aufgaben für rubus
#
# Trennzeichen ;
# 1. Stelle: z.B. HOST = Mounten von Verzeichnissen
# 2. Stelle: Server bzw. Datei
#
HOST;nexus
HOST;opus
HOST;fokus
HOST;sonus
HOST;fritz.box
HTTP;fritz.box;80
HTTP;hplaserjetcolor;80
Alles anzeigen
Das script
#!/bin/bash
#
# contact@xxx.de
#
# letzte Änderung: 2013-01-10
# 2013-01-14 heartbeat.list zur Konfiguration
#
# Ausstieg, wenn heartbeat per cron schon läuft
PS=/tmp/heartbeat.ps
if [ -e $PS ]; then
exit
else
echo 1 > $PS
fi
HOST=`hostname`
MAIL=root
DIR=/opt/rubus-tools
DONE=/tmp/heartbeat.done
LIST=$DIR/heartbeat.list
HTTP=/tmp/heartbeat.http
N=0
for TO_DO in `grep -v "#" $LIST`; do
TASK=`echo $TO_DO | cut -f1 -d";"`
SERVER=`echo $TO_DO | cut -f2 -d";"`
PORT=`echo $TO_DO | cut -f3 -d';'`
case $TASK in
HOST)
case $SERVER in
# nfs-Server
nexus)
let N="N +1"
echo -n `date` : $SERVER | tee $DONE
ping -c 1 $SERVER > /dev/null
if [ $? -eq 0 ]; then
echo " antwortet" | tee -a $DONE
if [ `/bin/mount -l | grep -v bind | grep -i $SERVER | wc -l` -eq 0 ]; then
# Server antwortet und ist nicht eingebunden
mount -t nfs4 $SERVER:/ /mnt/$SERVER
if [ $? -eq 0 ]; then
echo `date` ": mount.nfs4 /mnt/$SERVER" | tee -a $DONE
else
echo `date` ": Fehler - mount.nfs4 /mnt/$SERVER" | tee -a $DONE
fi
mount -t nfs $SERVER:/opt/tools /opt/tools -o nolock
if [ $? -eq 0 ]; then
echo `date` ": mount.nfs /opt/tools" | tee -a $DONE
else
echo `date` ": Fehler - mount.nfs /opt/tools" | tee -a $DONE
fi
fi
else
echo " antwortet nicht" | tee -a $DONE
if [ `/bin/mount -l | grep -v bind | grep -i $SERVER | wc -l` -gt 0 ]; then
# Server ist eingebunden und antwortet nicht
umount /mnt/$SERVER
if [ $? -eq 0 ]; then
echo `date` ": umount /mnt/$SERVER" | tee -a $DONE
else
echo `date` ": Fehler - umount /mnt/$SERVER" | tee -a $DONE
fi
umount /opt/tools
if [ $? -eq 0 ]; then
echo `date` ": umount /opt/tools" | tee -a $DONE
else
echo `date` ": Fehler - umount /opt/tools" | tee -a $DONE
fi
fi
fi
;;
fritz.box)
SHARE=Fritzbox
SMB=Speicher
let N="N +1"
echo -n `date` : $SERVER | tee -a $DONE
smbclient -N -L $SERVER > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo " bietet Service an" | tee -a $DONE
if [ `mount -l | grep $SERVER | wc -l` -eq 0 ]; then
/sbin/mount.cifs //$SERVER/$SMB /mnt/$SHARE -ocredentials=$DIR/.$SERVER,dir_mode=0777 2>/dev/null
if [ $? -eq 0 ]; then
echo `date` ": //$SERVER/$SHARE gemountet" | tee -a $DONE
else
echo `date` ": //$SERVER/$SHARE konnte nicht gemountet werden" | tee -a $DONE
fi
fi
else
echo " antwortet nicht" | tee -a $DONE
if [ `/bin/mount -l | grep -v bind | grep -i $SERVER | wc -l` -gt 0 ]; then
umount -f /mnt/$SHARE
echo `date` ": umount $SERVER/$SHARE" | tee -a $DONE
fi
fi
;;
*) # fokus opus sonus # Windows-Rechner bzw. Samba-Server
echo -n `date` : $SERVER | tee -a $DONE
let N="N +1"
smbclient -N -L $SERVER > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo " bietet Service an" | tee -a $DONE
for SHARE in `\ls /mnt/$SERVER`; do
if [ `mount -l | grep $SERVER/$SHARE | wc -l` -eq 0 ]; then
/sbin/mount.cifs //$SERVER/$SHARE /mnt/$SERVER/$SHARE -ocredentials=$DIR/.$SERVER,dir_mode=0777,uid=xxx,gid=users 2>/dev/null
if [ $? = 0 ]; then
echo `date` ": //$SERVER/$SHARE gemountet" | tee -a $DONE
else
echo `date` ": //$SERVER/$SHARE konnte nicht gemountet werden" | tee -a $DONE
fi
fi
done
else
echo " antwortet nicht" | tee -a $DONE
if [ `/bin/mount -l | grep -v bind | grep -i $SERVER | wc -l` -gt 0 ]; then
for SHARE in `\ls /mnt/$SERVER`; do
umount /mnt/$SERVER/$SHARE
echo `date` ": umount $SERVER/$SHARE" | tee -a $DONE
done
fi
fi
;;
esac
;;
HTTP)
nmap $SERVER -p$PORT -oG $HTTP.$SERVER.x --open >/dev/null
cat $HTTP.$SERVER.x | grep -v ^# > $HTTP.$SERVER.neu
if [ ! -e $HTTP.$SERVER ]; then # Zustand nach booten
if [ -s $HTTP.$SERVER.neu ]; then
echo `date` " erreichbar: http://$SERVER" | tee -a $DONE
else
echo `date` " $SERVER nicht erreichbar" | tee -a $DONE
fi
else
if [ `diff -q $HTTP.$SERVER.neu $HTTP.$SERVER | wc -l` -gt 0 ]; then
if [ -s $HTTP.$SERVER.neu ]; then
echo `date` " erreichbar: http://$SERVER" | tee -a $DONE
else
echo `date` " $SERVER nicht erreichbar " | tee -a $DONE
fi
fi
fi
rm $HTTP.$SERVER.x
mv $HTTP.$SERVER.neu $HTTP.$SERVER
;;
*)
echo `date` ": was soll das sein: $TASK" | tee -a $DONE
;;
esac
done
if [ `wc -l < $DONE` -gt $N ]; then
/usr/bin/mail -s $HOST:$0 $MAIL < $DONE
fi
rm $PS
Alles anzeigen
oder per cron-Job, der alle paar Minuten läuft.
Ich habe mir ein script gebastelt, dass nachschaut, welches Gerät welche Ressourcen zur Verfügung stellt.
Gegebenenfalls werden sie eingebunden, bzw. wieder ausgehängt.
Ich habe es mal getestet und habe "unbekannte" virtuelle Rechner auf die Fritzbox losgelassen, ein Win2K-Rechner und ein Debian.
Beide mit fester Adresse.
Ergebnis:
bei Debian erscheint der hostname, bei Windows PC-IP-Adresse.
Im Attachment zu sehen.
Regel also:
1.) hostname kann ermittelt werden
2.) es gibt eine feste IP
3.) es wird die MAC verwendet
ist nichts merkwürdig.
Nach Standard holt sich kein DNS-Server die Hostnamen von seinen Clienten, die muss man von Hand editieren.
Die Fritzboxen (alle! - schon meine gute alte 7050 tat das) sind aber auch Router -> sie müssen sich merken, wer im Netz ist,
damit sie deren Adresse auf die Internet-Adresse umsetzen können (die Funktion heißt dann NAT). Sonst könnte kein Gerät aus dem "Heimnetz" ins Internet.
Diese internen Adressen nehmen sie _auch_ in die DNS-Liste auf.
Meine Beobachtung:
manche Betriebssysteme geben den hostname an die Fritzbox weiter und der erscheint dann korrekt in der "Heimnetz"-Liste
(z.B. OpenSuse macht das).
Andere BS machen das nicht, dann ist der Listenname der Box z.B. PC-00-25-22-B1-F2-60 - also PC und die MAC-Adresse der Netzwerkkarte. Wahrscheinlich hat AVM noch ein paar andere Regeln für den Namen.
Andere Hersteller machen das ebenfalls - ich habe hier noch ein TP-Link MR3020 - da erscheinen ähnlich krude Namen.
Aber ist doch egal. Hauptsache, es gibt schon mal eine Liste, die ich nicht selbst erstellen muss. Ein einfacher Mausklick
und ich kann sie beliebig anpassen. Einfacher geht es nicht und es ist nur an einer Stelle im eigenen Netz.
Da muss ich noch mal nachfragen, wie heißt die Himbeere den nun?
raspberrypi oder RaspberryPi-192-168-178-27?
Zur Namensliste der Fritzbox:
Diese Namen sind die Einträge des DNS-Servers der Box.
Dass sind die Namen, die dann die anderen Rechner auflösen können.
Über den Befehl hostname auf dem pi bekommt man den eigenen Rechnernamen, der in der Datei /etc/hostname steht.
Man kann zwar über DHCP den Rechnernamen ändern lassen, ist aber nicht zwingend. Wenn beide Namen unterschiedlich sind, dann kennen die anderen Rechner den "hostname" nicht.
Manchmal (kann man irgendwo einstellen) muss man auch den vollständigen Namen verwenden (z.B. rubus.fritz.box) anstatt des kurzen (rubus). Mal testen.