Linuxコマンドライン(CLI)のベストプラクティスとヒントを蓄積するディスカッションを開始したいと思います。
以下のコメントを共有するためにそのようなディスカッションを検索しましたが、見つかりませんでした。したがって、この投稿です。
私たち全員がこれから学べることを願っています。
Bashのヒント、grep、sed、AWK、/ proc、およびその他すべての関連するLinux / Unixシステム管理、シェルプログラミングのベストプラクティスを共有してください。
Linuxコマンドライン(CLI)のベストプラクティスとヒントを蓄積するディスカッションを開始したいと思います。
以下のコメントを共有するためにそのようなディスカッションを検索しましたが、見つかりませんでした。したがって、この投稿です。
私たち全員がこれから学べることを願っています。
Bashのヒント、grep、sed、AWK、/ proc、およびその他すべての関連するLinux / Unixシステム管理、シェルプログラミングのベストプラクティスを共有してください。
回答:
screenを使用します。これは、GNUプロジェクトが開発した無料のターミナルマルチプレクサで、複数のターミナルを1つにまとめることができます。
セッションを開始でき、接続が失われても端末は保存されるため、後で再開したり、自宅から再開したりできます。
SSH!
SSHはgodコマンドです。学ぶための最も価値のある総合的なコマンドだと思います。オプションは非常に困難な場合がありますが、SSHに新しいコマンドラインオプションを使用することを常に学んでいるようです。この時点ですべてを使用した可能性があります。
使用すればするほど、それについて学ぶことができます。それを使用していくつかの驚くべきことを行うことができます。
注:これらはすべて、sshサーバーを実行することを除いて、サーバー上でセットアップすることなくリモートで実行できます。
インターネット経由でファイルシステムをマウントする
SSHFSのネットを検索
コマンドを転送します。
SVN + SSHプロトコルは、リモートクライアントから、デーモンが実行されていないサーバーへのSubversionです!SVNコマンドは、sshシェルを介してサーバーを起動し、既存のパイプを介して情報をやり取りします。rsyncプログラムも同じことを行い、rsyncデーモンを持たないサーバーに対して、SSHを介してサーバー自体を起動して実行します。独自のbashファイルを作成して、同様のトリックを実行するのは簡単です。
ファイアウォールを通過するチェーン
私はいつもこれを使って、自宅のLinuxサーバーからMacにジャンプします。
転送ポート:
自宅のファイアウォールを通過して自宅のルーターを自宅のネットワーク内から行っているかのように自宅から設定できることに気付くまで、中程度に役立つようです。
Xリクエストの転送:
これもまた素晴らしいものです。Xサーバーがリモートシステムで実行されているかどうかにかかわらず、x-windowsプログラムを実行すると、ローカル画面にウィンドウが表示されます。スイッチ-Xを使用するだけです!
リモートサーバーでXサーバーを実行する必要はないため、サーバーへのCPUの影響は最小限であり、Windowsおよびcygwin / Xを実行する強力なゲームPCに巨大なアプリを提供するTINY Linuxサーバーを使用できます。
もちろん、VIとEMACSはSSHで動作しますが、自宅で実行しているときは、もっと欲しいことがあります。ssh -Xを使用してEclipseのコピーを起動します!サーバーがラップトップよりも強力な場合、ラップトップ上にGUIがありますが、コンパイルはサーバー上で行われるため、システムの負荷について心配する必要はありません。
バッチファイルで実行
(つまり、他のシステムで「処理を行う」ローカルバッチファイルを実行することを意味します):
2つのことが組み合わさって、この1つがクールになります。1つは、(より安全な)暗号化キーを使用して、パスワードプロンプトを削除できることです。2番目は、SSH CLIでコマンドを指定できることです。リモートサーバーでコンパイルが失敗したときのように、これをいくつかの興味深い方法で使用しました。コンピューターにSSHで接続して、サウンドファイルを再生します)。
リモートコマンドからの出力をリダイレクトしてローカルバッチファイル内で使用できるため、サーバーで実行中のコンパイルをローカルで調整することもできます。
Macに内蔵
サーバーとクライアントの両方が、macとlinuxの両方に組み込まれています。MacとUbuntuの場合、サーバーの有効化は正しいチェックボックスを見つけるのと同じくらい簡単です。
PCにcygwinまたはcygwin / Xをインストールします(cygwin / Xを使用すると、x-window出力をLinuxマシンからWindows PCに転送できます-Xサーバーをインストールします)
重要なTips / configファイル
ファイアウォールでポート22を使用しないでください。あなたは多くのハックの試みを受けるでしょう、それだけの価値はありません。ファイアウォールに別のポートをサーバーに転送させるだけです。
sshコマンドを大幅に簡素化できる広範な構成オプションがあります。これが私の仕事の例です:
Host home
hostname billshome.hopto.org
Port=12345
user=bill
LocalForward=localhost:1025 mac:22
「ssh home」(他に何も入力しない)と入力すると、入力したように動作します。
ssh -p 12345 bill@billshome.hopto.org
次に、ローカルポート1025を自宅のシステム「mac」に転送します。これは、ファイルに別のエントリがあるためです。
Host mac
hostname localhost
port=1025
「ssh home」を実行してウィンドウを開いたままにすると、「ssh mac」と入力できます。ここで動作しているコンピューターは、実際には「mac: 22 "を他のコマンドで使用すると、ファイアウォールを介して自宅のMacに接続されます。
編集-クールなスクリプト!
大好きな古いスクリプトを見つけました。興味があるかもしれない人のために戻ってきて投稿しなければなりませんでした。スクリプトは「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
ホームディレクトリにこのスクリプトがあり、(ssh経由で)接続できるホストがある場合は、「./ authMe hostName」と入力できます。
必要に応じて公開/秘密キーペアを作成し、他のマシンにsshして公開キーをコピーします(sshコマンドはパスワードの入力を求めます...)
この後、SSHコマンドは、そのリモートシステムに接続するときにパスワードを要求しなくなり、パブリック/プライベートキーペアを使用します。
リモートコンピュータが常に安全であるとは限らない場合は、プロンプトが表示されたら「パスフレーズ」の設定を検討する必要があります。
セキュリティを強化するために、テキストパスワード(キーのみ)を許可しないように遠端のsshサーバーを構成することもできます。
ssh-copy-id
、それは同じくらい簡単ですssh-copy-id user@someserver
私は使うのが好きです
cd -
前のディレクトリに切り替えます。非常に便利!
私は最近、pv
猫に似ていますが、転送の詳細を含むコマンド(パイプビューアー)を発見しました。
の代わりに
$ gzip -c access.log > access.log.gz
使用できます
$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=> ] 15% ETA 0:00:59
だから、あなたの操作がいつ終わるのか分からない代わりに、今あなたは知っているでしょう!
tee(1)
。
押してCtrlキーを押しながらRは、コマンド(またはその一部)を入力し始めると-それは、コマンド履歴を検索します。もう一度Ctrl-Rを押すと、次の一致にジャンプし、enterが現在表示されているコマンドを実行し、右矢印(少なくとも)を使用して最初に編集できます。
$ (reverse-i-search)`svn': svn status
これを学ぶ前に、メインOSとして7年ほどLinuxを使用していましたが、今では知っているので、非常に便利です。
stty -ixon
XON / XOFFフロー制御の意味をオフにするために最初に行う必要がある場合があります(これにより、Ctrl-Qが使用可能になります。デフォルトでは、Ctrl-V quoted-insertと同じようにマップされますが、別のものに変更できます) )。man stty
およびman readline
を参照してください。stty
コマンドはあなたに追加することができます~/.bashrc
コマンドラインは面白いものです。自分で学ぶことができるのは自分だけで、残りはコマンドラインを使って他の人を見て偶然に学ぶことができると思います。
私は何年もの間シェルを使用して、ディレクトリ名を手作業で苦労して入力していました。ある日、友人がシステムをめちゃくちゃにしていて、彼がタブキーを押し続けているのを見ていました。「なぜタブを押すのですか?」と尋ねました。回答:ディレクトリまたはファイル名を完成させようとします。誰が推測するだろう-タブ補完!ファイルまたはディレクトリを少し入力し、タブを押すと、入力した内容を終了しようとします(ただし、動作はシェルによって異なります)。
ある日、友人はコマンドラインで私を見て、私が次のように入力するのを見ていたと言いました:
coryking@cory ~/trunk/mozi $ pushd /etc
/etc ~/trunk/mozi
coryking@cory /etc $ popd
~/trunk/mozi
coryking@cory ~/trunk/mozi $
誰が推測したでしょう!?彼は知らなかったpopd
/ pushd
。私たちも…
ログアウトした後でもプログラムを実行したままにしておくと便利な場合があります。そのためにnohupまたはscreenを使用するソリューションを見てきました。私が知っている最も簡単なのは:
$ your_command_here & disown
実行中のプログラムをデタッチすることもできます。
$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown
エイリアスではなく実際のコマンドを使用することを確認する場合は、先頭にバックスラッシュを使用します。
\rm -rf ~/tmp
builtin
」も参照してください。
このヒントにより、CLIがより快適になります(少なくとも私にとっては役立ちます)。
次の内容で〜/ .inputrcファイルを作成します。
"\e[A": history-search-backward
"\e[B": history-search-forward
bashをリロードします(「exec bash」と入力するなど)。コマンドのプレフィックスを入力して上矢印を押すと、たとえばsshと入力した場合、リモートシェルとの以前の接続が表示されます。プロンプトが空の場合、上矢印は通常の方法で履歴を参照します。
exec bash
man readline
デフォルトのショートカットを読んで記憶することも教育的です
bind -f ~/.inputrc
新しいbashを開始して現在の環境を消去することなく、inputrcを再ロードすることもできます。
複数のコマンドを一度に実行する場合の&&
代わりに使用し;
ます。エラーが発生すると停止し、他のコマンドを実行しません。
古典的な例:
./configure && make && make install
dosomething && echo "success" || echo "teh fail"
bashのコマンドラインでループを作成するとき、危険なコマンドの先頭に「echo」コマンドを付けることがよくあります。
for item in items; do echo something-risky; done
このようにして、実行をコミットする前に「何か危険な」ものを完全に見ることができます。危険なコマンドに変数展開とグロブが含まれる場合に役立ちます。また、「set -x」は、bashスクリプトを記述するときに非常に便利です。
'set -x'はデバッグを有効にします。bashデバッグの詳細については、http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.htmlを参照してください。
2つのサーバー間の最大帯域幅をテストする必要があります。
上のSERVER1行います。
nc -u -l 54321 > /dev/null
上SERVER2の操作を行います。
dd if=/dev/zero bs=1MB | nc -u SERVER1 54321 &
pid=$(pidof dd)
while (( 1 )); do kill -USR1 $pid; sleep 2; done
次のような出力が表示されます。
182682000000 bytes (183 GB) copied, 1555.74 seconds, 117 MB/s
182920+0 records in
182919+0 records out
ここでは117 MB / sが興味深い要素であり、実際のネットワーク転送帯域幅を示しています。
説明:
パケットがネットワーク上を流れ始めると、SERVER2の帯域幅統計を確認できるようになります。これは、2台のサーバー間の実際の最大帯域幅のかなり良い見積もりです。
UDPによるコピー(TCPオーバーヘッドを防ぐため)。
コピーから SERVER1上のメモリ(の/ dev /ゼロ)に Server2のメモリは、(を/ dev / null)、従ってボトルネックになってから、ディスクI / Oを防止します。
カラーディレクトリ構造が見やすくなりました。
alias ls="ls --color=tty"
編集
alias ls="ls --color=auto"
ログの表示に関するいくつかの小さなポインタ:
tail -f
あなたは一度に複数のログを見ることができます!例:tail -f log1.txt -f log2.txt
ファイルの拡張子を簡単に変更するために、友人から長い間トリックを学びました。
mv my_filename.{old,new}
シェル拡張により、これが次のように拡張されます。
mv my_filename.old my_filename.new
これは、次のものに何かを追加するなど、他の方法でファイルの名前を変更するためにも使用できます。
mv my_{,cool_}filename
ls -l /bin/c
Alt-Shift- {を押すと、これが完了ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}
します。
「tar xf」を使用して、圧縮アーカイブを抽出します。tarはアーカイブのファイルタイプを検出するため、bzip2のjとgzipのzは必要ありません。どちらも引数の前の '-'記号ではありません。多くの時間を節約できます(千年以上;-))。
さらに、unfooを使用して、不要な引数を指定せずに1つのコマンドでアーカイブを抽出してください。
alias ut="tar xf"
–アーカイブの抽出をさらに簡単にします。
私はこれらを常に使用しています
ALT-。(ESC +。一部の端末では)最後に使用された引数をコピーします(超便利)
CTRL-Wは単語を削除します
CTRL-Lクリアターミナル(clearコマンドに似ていますが高速です)
ALT-B(一部の端末ではESC + B)単語を後方に移動
ALT-F(一部の端末ではESC + F)は単語を進める
EOLへのCTRL-Eジャンプ
CTRL-A BOLへのジャンプ
履歴でのCTRL-R検索
bashでは、!$を頻繁に使用します。最後のコマンドの最後の引数を繰り返します。
ls /really/long/command/argument/that/you/dont/want/to/repeat.txt
vi !$
lsが実行されます。編集する場合は、再入力する必要はなく、!$を使用します。これは、長いパス/ファイル名に非常に便利です。また、!*は前のコマンドの引数をすべて繰り返します。私はそれほどそれを使用しませんが、それは便利に見えます。
それらが言及されていることは知っていましたが、vim、screen、cdを使用しています-
noclobberを忘れました:
set -o noclobber
man bashから:
設定されている場合、bashは、>、>&、および<>リダイレクト演算子で既存のファイルを上書きしません。これは、リダイレクト演算子> |を使用して出力ファイルを作成するときに上書きされる場合があります >の代わりに。
Alt-.
同様に行うことができます。
bashからzshに切り替えて、生産性が向上することを確認してください。
Googleにはさらに多くの利点があります。
古い学校、ディレクトリツリーをある場所から別の場所に移動し、シンボリックリンク、アクセス許可、その他すべてのものを保持します。
tar cBf - . | (cd /destination; tar xvBpf -)
またはネットワーク経由
tar cBf - . | rsh foo.com "cd /destination; tar xvBpf -)
新しい学校:
rsync -urltv . /destination
またはネットワーク経由
rsync -urltv -e ssh . foo.com:/destination
tar xvBpf - -C /destination
== (cd /destination; tar xvBpf -)
入力が少し少なくなり、sshよりも使いやすくなりました。
rsync -avh
1台のマシンで最適です- h
各リンクを個別のファイルに変換せずにハードリンクが正しく転送されるようにしますが、膨大な数のファイルがある場合は大量のメモリを使用できます。rsync -avzh . foo.com/destination
これはネットワークと同等であり、-e ssh
rsyncがsshを使用することを知っているため、通常は必要ありません。
rsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
要件:削除するファイルの大規模なリストを含むディレクトリがあります。rm -rは失敗します!
例
find /var/spool/mqueue/ | wc -l
191545
rm -f /var/spool/mqueue/*
-bash: /bin/rm: Argument list too long
解決策:
find /var/spool/mqueue/ -xdev -exec command rm -f '{}' +
説明:
編集:@ephemientコメントに続く説明を修正。
findは、引数の最大値を引数としてrmに提供します。これにより、rmはバッチでファイルを削除できます。これは、find自体の-delete操作を使用せずに、私が知っている最速の手法です。それは同等です
find /var/spool/mqueue -xdev -print0 | xargs -0 rm -f
がfind
サポートされていない場合に役立ちます-exec ... +
。
\;
with +
:その後、デフォルトでfind
行われる処理をxargs
実行します。これは、可能な限り引数をバッチ処理します(引数リストの制限を超えることはありません)。または単に(両方に必要なGNU Findutils)を使用する-delete
-ephemient -exec rm
find ... -delete
、もしあなたの発見がとても恵まれているなら。
この2つのヒントを頻繁に使用するので、共有することをお勧めします。
!foo
「foo」で始まる履歴ファイルの最後のコマンドを起動します(!gcc
たとえば、コンパイル時によく使用します)。
もう1つはキーボードショートカット(ReturnではなくCtrl + O)です。これにより、コマンドが実行され、履歴ファイルの次のコマンドが表示されます。たとえば、ファイルをコンパイルしてテストするときは、常に3つまたは4つのコマンドを実行し、make、テストのdirにcd、テストを実行、makefileのdirにcdします。Ctrl + Oを使用すると、このタスクが非常に簡単になります:)
この助けを願っています!
使用できない可能性のある派手なグラフィカルインターフェイスを使用せずに、LinuxでSubversionを使用する方法。
svn co <repo-url> . # Checks out project into current folder
svn update # Get latest changes from server
svn status # Shows what files have changed locally
svn add <path/filename> # Add some file to the repo
svn commit # Commit your changes to the repo
これにより、多くの開発者がLinuxを使用できなくなります。
最も見落とされていた旧式のコマンド: find
昨日、大まかな権限のバグを修復しました。
for u in nr dias simonpj; do
sudo -u $u find . -type d -exec chmod g+s '{}' ';'
done
chmod 644 $(find . -type f)
、chmod 755 $(find . -type d)
-perm
オプションを忘れないでくださいfind
。
grepは私の友人です。真剣に。
.rb
テキストを含むファイルをリストしますclass foo
。
grep -l "class foo" .rb
テキストを含まない.rb
ファイルをリストします:class foo
grep -L "class foo" *.rb
fooまたはbarを含まない.rb
ファイルを一覧表示します(正規表現は-eとともに使用できますが、演算子をエスケープする必要があります)。
grep -L -e "foo\|bar" *.rb