====== Wichtige Shell Befehle für den DBA unter Linux / Solaris ====== ====== Linux ====== ===== VI Befehle ===== ^Suchen & Ersetzen^ ^| |/ORA- |nach "Ora-" suchen|| |/ |letzte Suche wiederholen|| |n |letzte Suche wiederholen|| |:s/Error/Fehler/ |in aktueller Zeile suchen & ersetzen|| |:2,12s/Error/Fehler/|in Zeile 2 bis 12 suchen & ersetzen|| |:%s/Error/Fehler/ |in allen Zeilen suchen & ersetzen|| ^Zeilen ^ ^ |J|aktuelle Zeile an das Ende der vorhergehenden Zeile anhängen|| |:set number|Zeilennummer anzeigen|| ^Löschen^ ^| |:2,12d|Zeilen 2 bis 12 löschen|| |:.,$d|alle Zeilen löschen ("." = Anfang der Datei, "$" = Ende der Datei)|| ^Multiple Files^ ^| |:n|nächste Datei|| |:e#|vorherige Datei|| |:rew|gehe zur ersten Datei|| |:ar|Liste alle offenen Dateien auf|| \\ vi graphical cheat sheet => http://www.viemu.com/vi-vim-cheat-sheet.gif ---- =====Tar ===== Zippt alle Dateien in einem Verzeichnis tar cfvz archive.tar.gz /verzeichnis/ Entpackt tar xfvz archive.tar.gz ---- =====df===== Zeige nur die lokalen Filesystem "-l" an und ein total "--total", und das alles in einer Zeile in human readable format "-Ph" df -Ph -l --total ---- ====grep==== Zeilennummer mit ausgeben grep -n "ORA-" alert.log Zeilenweise um einen Treffer ausgeben mit Schalter -C grep -C 3 "ORA-" alert.log Treffer auschließen mit Schalter -v grep -v "ORA-00" alert.log Case insensitive suchen mit Schalter -i grep -i "ORA-" alert.log Nach mehr als einen Wort suchen Schalter -w mit "**\**| grep -w "Service name\|Preferred instances" # oder besser grep --color -E "2005|2009" Nur Dateinamen mit ausgegben **-H**, hilfreich beim Einsatz mit find: find . -name "*.log" -exec grep -H clock {} \; Recursive über Unterverzeichnisse suchen mit Schalter **-R** grep -R 'my_file' /dir/ ---- ==== Find ==== Suche einen Text und überspringe alles was nicht gelesen werden kann: find / -mount \! -readable -prune -o -path /dev -prune -o -name 'util_cmd' -ls see http://stackoverflow.com/questions/762348/how-can-i-exclude-all-permission-denied-messages-from-find Suche alle Files mit gesetzten S Bit und liste die Datei auf: find . -type f -perm -4000 -exec ls -ld {} \; Finde alle mit -mtime die nicht älter als x tage sind: (Man Page: -mtime n File's data was last modified n*24 hours ago ) find . -name "*_lgwr_*.trc" -mtime -1 -exec grep -H -A 1 "*** 2014-04-29 " {} \; Finde all die älter als 160 Tage sind: #Liste die Anzahl über die Tage auf: ls -la | awk '{ print $7 "-" $6 }' | sort | uniq -c #Alternativ über stat !Langsamer find . -name "*.aud" -exec stat -c %y {} \; | awk '{ print $1 }' | sort | uniq -c #Lösche Dateien die älter als 160 Tage sind: find . -name "*" -mtime +160 -exec rm {} \; Finde alle Links die auf diese Datei zeigen über die inode id ls -i iscsilogin.sh 526122 iscsilogin.sh cd /etc find . -follow -inum 526122 ./rc.d/init.d/iscsilogin.sh Zeige die Ordner Größe an: find . -maxdepth 1 -type d -print | xargs du -sm | sort -rn Zeige die 5 ältesten und neuesten Dateien: #älteste ls -ltr | head -5 #neuste ls -ltr | tail -5 Mehr Beispiele: http://content.hccfl.edu/pollock/unix/findcmd.htm Zähle alle Dateien in diesem Directory: find ${DATA_DIR}/* -maxdepth 0 -type f | wc -l ---- ==== Änderungsdatum einer Datei mit stat ==== Mit dem stat befehlt lassen sich alle Datei Eigenschaften einfach auswerten LASTTOUCH=$(stat -c %y backuo.log) LASTTOUCH=${MODDATE%% *} echo $LASTTOUCH ---- ==== du ==== Wieviel Platz belegt ein Verzeichnis: # eingeschränkt auf eine Ebene: du --max-depth=1 -h . Alternatives Werkzeug **ncdu**, siehe => http://dev.yorhel.nl/ncdu # install yum install http://download.opensuse.org/repositories/utilities/RHEL_6/i686/ncdu-1.10-13.2.i686.rpm #start ncdu Alle Dateien die größer als 1GB sind: find / -type f -size +1048576 ---- === ps ==== Beispiel nur das Kommando soll angezeigt werden: ps -o cmd afx /u00/app/oracle/oem/12.1.0/agent/agent_inst/sysman/log/emagent.n \_ /u00/app/oracle/run.sh -root #Falls Treffer in der zweiten Zeile die führenden \ wieder entferenen ps -o cmd afx |grep -v grep | grep "root" | sed -e s/"\\\\_ "/""/g #gibt nur noch aus: /u00/app/oracle/run.sh -root **ps aux** * USER = user owning the process * PID = process ID of the process * %CPU = It is the CPU time used divided by the time the process has been running. * %MEM = ratio of the process’s resident set size to the physical memory on the machine * VSZ = virtual memory usage of entire process * RSS = resident set size, the non-swapped physical memory that a task has used * TTY = controlling tty (terminal) * STAT = multi-character process state * START = starting time or date of the process * TIME = cumulative CPU time * COMMAND = command with all its arguments ---- ==== Xargs ==== Textausgabe in einer Pipe wiederum als Argument für ein nachfolgendes Programm verwenden. Hier ein gutes Beispiel: http://sidvind.com/wiki/Xargs_by_example find . -name "*_lgwr_*.trc" -exec ls -ld {} \; | xargs -0 echo ---- ==== AWK ==== ==Ein einfache Hochkomma in einer Ergebnissliste erzeugen beim Aufruf von AWK in der Bash== Leider ist mir bisher nicht gelungen dazu die richtige Escape Squence zu finden. Beispiel ps uafx | grep smon | awk '{ print "@"$1"@" }' | sed -e s/"@"/"'"/g 'oracle' 'oracle2' == Mit Field Seperator und Such Ausdruck Wert aus einer Datei lesen === "-F" Fild Seperator setzen - Suche in aktueller Zeile mit // und Ausgabe des zweiten Wertes: awk -F: ' /grid/ {print $2}' /etc/oratab ---- ===== watch ==== einen Befehl alle n sekunden wiederholen watch -n 10 "df | grep backup" ---- ===== who ==== ==last reboot== who -b system boot 2013-01-21 04:51 uptime # see the value behind up! ==Aktueller Run Level== who -r run-level 3 2014-07-30 06:47 last=S ==Wer ist angemeldet== who -u ---- ===== ssh key austausch ==== Auf drei Knoten unter den User Oracle Key's erzeugen und dann verteilen As User oracle on node 1 #generate key on every node ssh-keygen -t rsa ssh cGPIrac2 ssh-keygen -t rsa ssh cGPIrac3 ssh-keygen -t rsa # Copy public key from one node to the other #2/3 to 1 ssh cGPIrac2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ssh cGPIrac3 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys #1/3 to 2 ssh cGPIrac2 ssh cGPIrac1 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ssh cGPIrac3 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys #1/2 to 3 ssh cGPIrac3 ssh cGPIrac1 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ssh cGPIrac2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ---- ==== Befehle auf meheren Knoten ausführen ==== Per Schleife und ssh : for i in {1..4}; do ssh gpi-nosql0$i "hostname ;date ; exit"; done ---- === Datei erzeugen mit dd === Eine Test Datei mit mit 1GB Größe mit dd anlegen: dd if=/dev/zero of=copy_test_file.dmp bs=1M count=1000 ---- ==== In allen Dateien Änderungen durchführen ==== In allen Dateien eines Verzeichnisses das vorkommen eines wortes durch ein anderes ersetzen.\\ !/bin/bash for file in $(grep -l -R $searchterm $startdirectory) do sed -e "s/$searchterm/$replaceterm/ig" $file > /tmp/tempfile.tmp mv /tmp/tempfile.tmp $file echo "Modified: " $file done ---- ==== Was liegt hier so großes im Verzeichnis herum? ==== Mit du und sort die großen Daten suchen du -skx * | sort -nk 1,1 ---- ===== Wer hat welche Datei gerade offen - show open files ===== **lsof hilft hier weiter** unter /usr/sbin oder /sbin lsof | grep oracle **fuser - wer verwendet das Verzeichnis** unter /sbin /sbin/fuser -m -a -v $ORACLE_HOME ---- ===== Unter welchen Rechten läuft ein Prozess wie der listner ===== Über die Datei /proc//status kann geprüft werden, mit welchen Rechten ein Prozess in Linux gestartet wurde. ps uafx | grep LISTENER oracle 1777 .... cat /proc/9177/status Name: tnslsnr State: S (sleeping) SleepAVG: 98% Tgid: 9177 Pid: 9177 PPid: 1 TracerPid: 0 Uid: 1000 1000 1000 1000 Gid: 502 502 502 502 FDSize: 512 Groups: 602 703 1004 1009 1044 1006 1630 ... ---- ===== Firewall - Open Ports vom Client testen ===== Auf einer Maschine soll vorab gepürft werden ob der Listener ereichbar wäre. Leider ist aber noch nichts zum prüfen installiert. Ziel: Testen ob in einer FW schon der Port freigeschaltet ist, im Beispiel der 1521: mit nc (siehe [[http://linux.die.net/man/1/nc| Manpage nc]] eine Listen Port auf dem Target erzeugen: # start on server a process on port 1521 # ein Port nc -l $HOSTNAME 1521 # nc gleichzeitig auf mehreren ports starten export first_port=3100 export last_port =3140 for (( i = first_port; i <= last_port; i++ )) do nc -l $HOSTNAME ${i} & done Mehr über nc siehe hier http://www.sans.org/security-resources/sec560/netcat_cheat_sheet_v1.pdf Mit telnet oder curl dann vom Client testen ob der Server unter diesem Port erreichbar ist: telnet my_server_name 1521 #alternativ wenn kein Telnet mehr zur Verfügung steht: curl http://my_server_name:1521 #alternativ mit nc mit der z option nc -z my_server_name 1521 Connection to my_server_name 1521 port [tcp/*] succeeded! # alternativ mit nc über einen ganzen Port Range nc -z my_server_name 5100-5140 # timing time yes | nc -z my_server_name 1521 real 0m0.004s user 0m0.002s sys 0m0.002s # alternativ mit gnu time /usr/bin/time -f %E nc -z my_server_name 6838 ---- ==== TCP Dump ==== Alle Packete von und zu einem Host protokollieren: # -X mit dem Content der Packete! tcpdump -nnvvSX == Siehe auch == * http://www.danielmiessler.com/study/tcpdump/ * http://www.thegeekstuff.com/2010/08/tcpdump-command-examples/ * http://openmaniak.com/tcpdump.php ---- ===== Blocksize eines Filesystems und die maximale Größe einer Datei ===== mit fstune -l kann diese Information angezeigt werden tune2fs -l /dev/sda siehe auch => http://www.howtoadvice.com/Ext3Max ---- ====Crontab:==== crontab -e # Minute Hour Day of Month Month Day of Week Command # (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat) 01 14 20 02 * /home/oragpi/scripts/call_rman_script.sh see http://www.pantz.org/software/cron/croninfo.html ===== Cron Tab Examples ===== * http://www.pantz.org/software/cron/croninfo.html * http://www.corntab.com/ * http://ratgeber-community.com/wiederkehrende-aufgaben-von-crontab-als-cronjob-ausfuehren-lassen-6dd0292e Einen Befehl zur Ausführung sofort zur Crontab einmalig hinzufügen: at now >script.sh # close and start the script with ^d Ein Guter Generator => https://crontab-generator.org/ ---- ==== Mit welchen Parametern wurde der Kernel gestartet ==== cat /proc/cmdline ---- ==== strace - was wird von einem Programm alles verwendet/aufgerufen ==== Schalter: * -f - Child Prozesse mit ein beziehen ( mit -ff und -o pro child eine eigene Output Datei ) * -e - filteren zum Bespiel nur auf read oder open Calls ---- ===== Welche Hardware ist installiert ===== Zum Beispiel um die Netzwerkkarten anzueigen: # lshw -class network ---- ===== Hex IP Adressen interpretieren ==== Gelegentlich wird eine IP Adresse als HEX Wert ausgeben. Ein Beispiel ist die Output von "onsctl debug" im Oracle Real Application Cluster. onsctl debug ... b42 0000:0000:0000:0000:0000:ffff:0aB8:7c12 .. # Umwandeln mit # auf die großschreibung achten! for i in A B8 7C 12 do printf "%d." $(echo "ibase=16; $i" | bc) done # oder als kleine Funktion hexIP_decIP(){ echo -n $(echo "ibase=16; $1" | bc). echo -n $(echo "ibase=16; $2" | bc). echo -n $(echo "ibase=16; $3" | bc). echo -n $(echo "ibase=16; $4" | bc) } ---- ==== Yum ==== Mit Yum ein normales RPM Packet installieren, um zum Beispiel [[https://www.google.com/intl/en/chrome/browser/?platform=linux|Chrome]] auf einem Server ohne Internet Zugang. Schalter **--nogpgcheck** und Parameter **localinstall**: yum --nogpgcheck localinstall google-chrome-stable_current_x86_64.rpm ---- ==== Dateien zusammen fügen ==== === Paste === Zwei Datein Spalten weise zusammen fügen: data1 A B C D data2 10 20 30 40 Zusammenfügen mit einen "," als Trenner: paste -d "," data1 data2 A,10 B,20 C,30 D,40 Alternativ Daten Transponieren mit "paste -s" paste -s data1 data2 A B C D 10 20 30 40 Quelle => http://www.problem-hilfe.de/linux/h/Shells/paste.html ---- === Dateien anhängen === cat data1 data2 > data3 ---- ===== Bash Scripting Examples ===== * [[linux:bash_script_snippets|Bash Snippets für Skripting]] * http://tldp.org/LDP/abs/html/ ---- ---- ====== Solaris ===== ===== Prozess Argumente anzeigen ===== Tool **pargs ** \\ siehe http://www.c0t0d0s0.org/archives/4779-Less-known-Solaris-Features-Getting-the-command-line-and-environment-of-running-processes.html ---- ===== md5 solaris anzeigen ===== Immer daran denken die checksum von Installationspaketen zuprüfen, nicht das was fehlt! digest -v -a md5 p8202632_10205_SOLARIS64.zip md5 (p8202632_10205_SOLARIS64.zip) = 4caeb39adc1aac52e6146f970e9378d6 ---- ===== Hostname mit Domain anzeigen lassen ==== echo $(hostname).$(domainname) ---- ===== 32/64 bit Kernel ?? in solaris anzeigen ===== #Betriebsystem /usr/bin/isainfo -kv 64-bit amd64 kernel modules # #für die installierte Oracle Version file $ORACLE_HOME/bin/oracle oracle: ELF 64-bit LSB executable AMD64 Version 1, dynamically linked, not stripped ----