Frage Best Practices und Tipps zur Linux-Befehlszeile?


Ich würde gerne eine Diskussion eröffnen, in der Ihre Best Practices und Tipps zur Linux-Befehlszeile (CLI) gesammelt werden.

Ich habe nach einer solchen Diskussion gesucht, um den folgenden Kommentar zu teilen, habe aber keinen gefunden, daher dieser Beitrag.

Ich hoffe, wir könnten alle daraus lernen.

Sie sind herzlich eingeladen, Ihre Bash-Tipps, grep, sed, AWK, / proc und alle anderen verwandten Linux / Unix-Systemadministration, Best Practices für die Shell-Programmierung zum Nutzen von uns allen zu teilen.


112
2018-03-02 21:23


Ursprung


Warum nur Linux? Viele Tipps können bei fast allen Varianten von Unix nützlich sein. - mouviciel
Diese Frage mag ein bisschen weit gefasst sein - es gibt genug Linux / Unix Command Line Best Practices, um ganze Bücher zu füllen ... - Jonik
Ich stimme zu, dass Unix-Tipps, die auf Linux angewendet werden können, ebenfalls sehr willkommen sind. Ich habe Linux geschrieben, weil A. Hier arbeiten wir. B. weil es in den letzten Jahren ein breiteres öffentliches Exposure erreicht hat als Unix. - Maxim Veksler
Ich denke, es ist eine großartige Idee, eine Liste der nützlichsten und interessantesten Befehle zu erstellen, die die Leute benutzen.
Sind diese relevant? refspecs.freestandards.org


Antworten:


Benutzen Bildschirm, ein vom GNU-Projekt entwickelter freier Terminal-Multiplexer, der es Ihnen ermöglicht, mehrere Terminals in einem zu haben.

Sie können eine Sitzung starten, und Ihre Terminals werden auch dann gespeichert, wenn die Verbindung unterbrochen wird, sodass Sie später oder von zu Hause aus fortfahren können.


111
2018-03-02 22:52



Die gebräuchlichsten Switches, die ich verwende, sind 'screen -DR' zum Abnehmen und Fortsetzen meiner letzten Bildschirmsitzung und 'screen -x', um dieselbe Bildschirmsitzung von mehreren Logins aus zu sehen. Also, hol dir eine nette .screenrc aus dotfiles.org/.screenrc - Nick Devereaux
Eine andere nette Sache über den Bildschirm ist, dass Sie ein Terminal mit anderen Leuten teilen können, wenn Sie an etwas mit dem Bildschirm -x zusammenarbeiten möchten - gareth_bowles


SSH!
SSH ist der Gottesbefehl - ich denke, es ist der wertvollste Befehl, den es zu lernen gilt. Die Optionen können ziemlich entmutigend sein, aber es scheint, als ob ich ständig neue Befehlszeilenoptionen für SSH lerne, die ich nie für nötig gehalten hätte. Ich könnte sie alle an diesem Punkt benutzt haben.

Je mehr Sie es verwenden, desto mehr lernen Sie darüber. Sie können es verwenden, um einige erstaunliche Dinge zu tun.

Hinweis: Alle diese Dinge sind remote ohne Setup auf Ihrem Server ausführbar, außer dass ssh Server läuft.

Mounten Sie ein Dateisystem über das Internet 

Suche im Internet nach SSHFS

Befehle weiterleiten.

Das SVN + SSH-Protokoll ist Subversion von einem Remote-Client zu einem Server, auf dem NO DEAMON läuft! Der SVN-Befehl startet den Server über die SSH-Shell und leitet die Informationen durch die vorhandene Pipe hin und her. Das rsync-Programm macht dasselbe, läuft gegen einen Server ohne rsync-deamon, indem er sich selbst über SSH startet. Es ist einfach, eigene bash-Dateien zu schreiben, um ähnliche Tricks zu machen.

Kette, um durch Firewalls zu kommen 

Ich benutze dies die ganze Zeit, um durch meinen Linux-Server zu Hause zu meinem Mac zu springen.

Vorwärtsports:
Scheint nur mäßig nützlich, bis Sie erkennen, dass Sie durch Ihre Hausfirewall springen können und Ihren Router zu Hause von der Arbeit aus konfigurieren können, als ob Sie dies von Ihrem Heimnetzwerk aus tun würden.

Weiterleiten von X-Anfragen: 

Dies ist ein weiterer erstaunlicher. Mit oder ohne einen X-Server, der auf Ihrem Remote-System ausgeführt wird, können Sie ein X-Windows-Programm ausführen, und das Fenster wird auf Ihrem lokalen Bildschirm angezeigt. Verwenden Sie einfach den Schalter -X, das ist alles!

Da Sie ein X-Server läuft auf Remote-Server müssen die CPU Auswirkungen auf Ihrem Server nicht, ist minimal, können Sie einen TINY Linux-Server haben, die große Anwendungen auf Ihr gewaltiges Spiel PC serviert unter Windows und Cygwin / X.

Natürlich arbeiten VI und EMACS über SSH, aber wenn ich zuhause renne, will ich manchmal mehr. Ich benutze ssh -X, um eine Kopie von Eclipse zu starten! Wenn Ihr Server leistungsfähiger als Ihr Laptop ist, haben Sie die GUI direkt auf Ihrem Laptop, aber die Kompilierung erfolgt auf Ihrem Server, also sorgen Sie sich nicht um die Systemlast.

In Batch-Dateien ausführen 

(was bedeutet, dass eine lokale Batch-Datei ausgeführt wird, die auf anderen Systemen "stuff" macht):

Zwei Dinge kombinieren, um dieses eine coole zu machen. Zum einen können Sie Passwortaufforderungen durch Verwendung von (sichereren) Verschlüsselungsschlüsseln beseitigen. Die zweite Möglichkeit besteht darin, einen Befehl auf der SSH-CLI anzugeben. Ich habe es auf einige interessante Weisen benutzt - Wie wenn eine Kompilierung auf dem Remote-Server fehlschlägt, würde ich es SSH in meinem Computer haben und eine Audiodatei abspielen.

Denken Sie daran, dass Sie die Ausgabe des Remotebefehls umleiten und in Ihrer lokalen Stapeldatei verwenden können, sodass Sie auch lokal eine Kompilierung auf Ihrem Server durchführen können.

Eingebaut in Mac

Sowohl Server als auch Client sind in Mac und Linux integriert. Im Falle des Mac und Ubuntu ist das Aktivieren eines Servers so einfach wie das Finden der richtigen Checkbox.

Auf einem PC installieren Sie cygwin oder cygwin / X (cygwin / X ermöglicht es Ihnen, Ihre x-window-Ausgabe von Ihrem Linux-Rechner auf Ihren Windows-PC zu übertragen - es installiert einen X-Server)

Wichtige Tipps / Konfigurationsdatei

Verwenden Sie niemals Port 22 in Ihrer Firewall. Du wirst eine Menge Hack-Versuche bekommen, es ist es einfach nicht wert. Lassen Sie Ihre Firewall einfach einen anderen Port an Ihren Server weiterleiten.

Es gibt umfangreiche Konfigurationsoptionen, mit denen Sie Ihre ssh-Befehle erheblich vereinfachen können. Hier ist ein Beispiel von mir bei der Arbeit:

Host home
    hostname billshome.hopto.org
    Port=12345
    user=bill
    LocalForward=localhost:1025 mac:22

Wenn ich "ssh home" (nichts anderes) eintippe, verhält es sich so, als ob ich getippt hätte:

ssh -p 12345 bill@billshome.hopto.org

und leitet dann meinen lokalen Port 1025 an mein System "mac" zu Hause weiter. Der Grund dafür ist, dass ich einen weiteren Eintrag in meiner Datei habe:

Host mac
    hostname localhost
    port=1025

so dass, sobald ich ein "ssh home" gemacht habe und immer noch das Fenster geöffnet habe, kann ich "ssh mac" eingeben und der Computer bei der Arbeit wird hier versuchen, sich mit seinem eigenen Port 1025 zu verbinden, der an "mac: 22 "durch den anderen Befehl, so wird es zu meinem Mac zu Hause durch die Firewall verbinden.

Edit - cooles Skript!

Ich habe ein altes Drehbuch ausgegraben, das ich einfach liebe - ich musste es zurückgeben und es für jeden hier veröffentlichen, der interessiert sein könnte. Das Skript heißt "authMe"

#!/bin/bash
if [ ! -f ~/.ssh/id_dsa.pub ]
then
    echo 'id_dsa.pub does not exist, creating'
    ssh-keygen -tdsa
fi
ssh $1 'cat >>.ssh/authorized_keys' <~/.ssh/id_dsa.pub

Wenn Sie dieses Skript in Ihrem Home-Verzeichnis haben und es einen Host gibt, mit dem Sie sich verbinden können (über ssh), dann können Sie "./authMe hostName" eingeben.

Bei Bedarf erstellt es ein öffentliches / privates Schlüsselpaar für Sie, dann wird es an den anderen Rechner gesendet und kopiert Ihren öffentlichen Schlüssel (der ssh Befehl wird Sie nach einem Passwort fragen ...)

Danach sollte der SSH-Befehl nicht mehr nach Ihrem Passwort fragen, wenn er an dieses Remote-System angeschlossen wird, er verwendet das öffentliche / private Schlüsselpaar.

Wenn Ihr Remote-Computer nicht immer sicher ist, sollten Sie eine "Passphrase" festlegen, wenn Sie dazu aufgefordert werden.

Sie können auch den ssh-Server am fernen Ende so konfigurieren, dass für zusätzliche Sicherheit keine Textkennwörter (nur Schlüssel) zulässig sind.


101



+1 sehr schöne und kompakte Post - Karsten
Eine kleine Anmerkung zu SSH über Port 22: vorausgesetzt, Sie haben ein gutes root-Passwort und Ihre Benutzer haben keine schrecklichen Passwörter, reicht das Ausführen von fail2ban (oder etwas Ähnlichem) aus, um Crack-Versuche fernzuhalten. Ich fand es wirklich ärgerlich, SSH auf einem anderen Port zu halten. - David Wolever
Es kann manchmal ärgerlich sein, aber das Volumen der Verbindungen war nur gruselig. Ich weiß, dass sie nicht durchkommen sollen, aber es ist irgendwie so, als ob jemand jede Minute zu deinem Haus gehen würde und mit deinem Türknauf herumspielen würde - nur nervend.
Es gibt eine eingebaute Version Ihres letzten Befehls in den meisten Versionen von ssh heutzutage, es heißt ssh-copy-idund es ist so einfach wie ssh-copy-id user@someserver - JamesHannah
Eine weitere Möglichkeit, Ihren 'ssh mac' Trick auszuführen, ist die Verwendung einer ProxyCommand-Direktive in Ihrer .ssh / config-Datei. Host mac ProxyCommand ssh -q home "nc% h% p" Damit wird netcat (nc) zu Hause ausgeführt und leitet Ihre ssh-Verbindung direkt an mac weiter. Ich finde diese leichter zu ketten (zum Beispiel, wenn du dich mit 'home' verbinden musst, um zu 'work bastion' zu gelangen, um zum 'work web server' zu gelangen. - toppledwagon


Ich mag es zu benutzen

cd -

um zum vorherigen Verzeichnis zu wechseln. Sehr hilfreich!


73



Ich habe das nie gewusst! Vielen Dank! Bei einer verwandten Anmerkung machen pushd und popd etwas Ähnliches, indem sie einen Stapel von Dirs aufbauen. Diese Art von Tricks hilft dir, wenn du durch eine tiefe Richtungsstruktur navigierst.
Das ist reine Erleuchtung. - Manuel Ferreria


Ich habe kürzlich das entdeckt pv Befehl (Pipe Viewer), der wie Katze aber mit Übertragungsdetails ist.

Also statt

$ gzip -c access.log > access.log.gz

Sie können verwenden

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

Anstatt also keine Ahnung zu haben, wann Ihre Operation abgeschlossen sein wird, werden Sie es jetzt wissen!

Mit freundlicher Genehmigung von Peteris Krumins 


69



$ gzip -c access.log> access.log.gz Warum nicht nur: $ gzip access.log
Oh, das funktioniert :) Ich habe das Beispiel von Peteris Website genommen. - Nick Devereaux
Das sieht gut aus tee(1). - Daniel C. Sobral
Extrem nützlicher Nutzen, den ich immer vergesse :-( - Patrick


sudo !!

Führen Sie den vorherigen Befehl als root erneut aus.

[Der aktuelle Top-Befehl auf der Site http://www.commandlinefu.com, eine Website, die dem Thema dieser Frage gewidmet ist.]


53



Offenlegung - Ich führe commandlinefu.com - codeinthehole
Es hätte diesem Kerl 16 Zeichen gespart: xkcd.com/149


Drücken Sie Strg-R und beginnen Sie mit der Eingabe eines Befehls (oder eines Teils davon) - es durchsucht den Befehlsverlauf. Wenn Sie Strg-R erneut drücken, wird zur nächsten Übereinstimmung gesprungen, durch Eingabe wird der aktuell angezeigte Befehl ausgeführt und mit der rechten Maustaste (zumindest) können Sie ihn zuerst bearbeiten.

$ (reverse-i-search)`svn': svn status

Ich habe Linux für ungefähr 7 Jahre als mein Hauptbetriebssystem benutzt, bevor ich davon erfuhr, aber jetzt, da ich es weiß, ist es ziemlich praktisch.


46



Vielen Dank. Ich habe die Rückwärtssuche verwendet, bin aber nicht in der Lage, herauszufinden, wie ich zum nächsten Spiel springen kann. - Adam
Strg-S springt zum nächsten Spiel. Sie müssen möglicherweise tun stty -ixon zuerst, um die XON / XOFF-Flusssteuerungsbedeutung auszuschalten (dies stellt auch Ctrl-Q zur Verfügung, standardmäßig ist es dem Ctrl-V-quoted-insert zugeordnet, aber Sie können es zu etwas anderem ändern). Sehen man stty und man readline für weitere Informationen. Das stty Befehl kann zu Ihrem hinzugefügt werden ~/.bashrc - Dennis Williamson


Die Befehlszeile ist eine lustige Sache. Ich denke, dass du nur so viel alleine lernen kannst und den Rest lernst du durch Zufall, wenn du jemanden über eine Befehlszeile beobachtest.

Ich benutzte die Shell jahrelang, um mühsam Verzeichnisnamen von Hand einzugeben. Eines Tages sah ich einen Freund auf einem System herumlaufen und er schlug weiter auf die Tabulatortaste. Ich fragte: "Warum schlägst du Tab?". Antwort: Es versucht das Verzeichnis oder den Dateinamen zu vervollständigen. Wer hätte das gedacht - tab completion! Geben Sie ein Bit der Datei oder des Verzeichnisses ein, drücken Sie die Tabulatortaste und es wird versucht, das zu beenden, was Sie eingegeben haben (das Verhalten hängt von der jeweiligen Shell ab).

Eines Tages beobachtete mich dieser Freund auf der Kommandozeile und beobachtete, wie ich etwas wie:

coryking@cory ~/trunk/mozi $ pushd /etc
/etc ~/trunk/mozi
coryking@cory /etc $ popd
~/trunk/mozi
coryking@cory ~/trunk/mozi $

Wer hätte das gedacht !? Er wusste nie davon popd / pushd. Schätze, wir sind sogar ...


45



Tab Completion scheint für mich etwas "Offensichtliches" zu sein, sehr einfach, aber ich wusste auch nichts über Popd / Pushd. Lustig in der Tat. :) - Jonik
Sehen Sie sich auch diese Antwort an, um mehr als nur Befehle, Dateien und Verzeichnisse zu tabellieren: stackoverflow.com/questions/603696/0603919#603919 - Jonik
Das ist wirklich wahr. Ich habe von bashs rückwärts-geschichte-suche (ctrl-r) erfahren, indem ich jemanden beobachtet habe. Später stellte ich fest, dass es sich um eine Readline-Funktion handelte und arbeitete in anderen Programmen, die readline (mysql, gdb, python-i, clisp usw.) enthalten, genauso. - sigjuice
Wie können Sie "the shell" seit Jahren nutzen und wissen nicht, wie Tabs fertiggestellt werden? - prestomation
Wenn Sie mit Pushd / Popd umgehen, vergessen Sie nicht, den Befehl zu erwähnen dirs. Es zeigt an, was auf dem Pushd / Popd-Stack ist. - slm


Lerne Vim.

Es ist (wahrscheinlich) der beste Editor, aber sicherlich der beste Editor, der auf einem Linux-Server verfügbar ist.


41



gvim ist auch der beste Dateibrowser unter Windows;)
Dies ist auch äußerst nützlich, denn sobald Sie vim kennen, können Sie die meisten Shells in den vi-Modus versetzen und die Navigation wird extrem einfach und schnell - Patrick


Manchmal ist es sinnvoll, ein Programm auch nach dem Abmelden laufen zu lassen. Ich habe einige Lösungen gesehen, die nohup oder sogar Bildschirm für diesen Zweck verwenden. Das einfachste, das ich kenne, ist:

$ your_command_here & disown

Sie können auch ein laufendes Programm trennen:

$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown

38



Die Verwendung des Bildschirms ist großartig, weil Sie später von überall aus die Verbindung zu dieser App wiederherstellen können. - prestomation
+1, ich hatte noch nicht gehört. - user18911
dito re disown, obwohl ich das schon mit dem Bildschirm mache - Andy


Wenn ich sicherstellen möchte, dass ich einen tatsächlichen Befehl und keinen Alias ​​verwende, verwende ich einen führenden Backslash:

\rm -rf ~/tmp

38



ist das das gleiche wie "command rm -rf ~ / tmp"? - Maxim Veksler
Ich kannte "command" nicht, aber es sieht genauso aus. - mouviciel
Nun ja, es sei denn, der "Befehl" ist kein Alias. In diesem Fall müssten Sie \ command rm -rf ~ / tmp verwenden. In diesem Fall ist \ rm -rf ~ / tmp besser - Jamol
@presario und du denkst das wäre möglich einen Alias ​​für "/" zu machen? Schade, dass ich die Kommentare nicht verbessern kann :)
Siehe auch den ähnlichen Befehl "builtin". - Dennis Williamson