仕事で使えそうな(使ってる)コンソール作業ねた。あまりたいしたことはしてないけど、まあまあ便利な使い方をつらつらと書いていく。
この機能自体いらないという場合は.bashrcなどに
結構奥が深いのでshell変数ねたにまとめ
それなりに多いのでopensslねたにまとめ
それなりに多いのでperlねたにまとめ
なんとなくnetworkねたにまとめ
カーソルだけ移動したい場合
入力 | 説明 |
---|---|
Ctrl+A | 行頭に移動 |
Ctrl+E | 行末に移動 |
Ctrl+B | 1文字左に移動 |
Ctrl+F | 1文字右に移動 |
ESC+B | 1単語左に移動 |
ESC+F | 1単語右に移動 |
Ctrl+D, Cltl+H | 一文字削除 |
Ctrl+s | キー入力できなくなったように見える操作 |
Ctrl+q | キー入力できなくなった状態を解除する操作 |
stty stop undefとすればよい
最近はtmuxとかあるから使うことそんなにないけどAlt+F1 - F6でそれぞれの画面を切り替えることが可能。gpmサービスが動作していれば,仮想コンソール間でコピー&ペーストも可能らしい。不要であれば/etc/inittabに
1:12345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6と記述されているので、不要なのをコメントアウトなりすれば多少メモリの節約になる。
忘れがちなので
その他(よくわからん)
n. 新しいドキュメンテーション: よりふさわしい場所に移動されるだろう
o. 古いドキュメンテーション 猶予期間として保存されているもの
l. 独自のシステムについてのローカルなドキュメンテーション
- だれもが実行できるユーザコマンド
- システムコール、つまり、カーネルが提供する関数
- サブルーチン、つまり、ライブラリ関数
- デバイス、つまり、/dev ディレクトリのスペシャルファイル
- ファイルフォーマットの説明、例 /etc/passwd
- ゲーム。明らかにいらん
- その他 例: マクロパッケージや取り決め的な文書
- システム管理者だけが実行できるシステム管理用のツール
- Linux 独自のカーネルルーチン用のドキュメンテーション
その他(よくわからん)
n. 新しいドキュメンテーション: よりふさわしい場所に移動されるだろう
o. 古いドキュメンテーション 猶予期間として保存されているもの
l. 独自のシステムについてのローカルなドキュメンテーション
shellscriptを作るときとか。古い記事だけどまとまっているのがあった。http://itpro.nikkeibp.co.jp/article/COLUMN/2006022...
正規表現の先頭に暗黙のうちに"^"(行頭)が付加されることに注意。マッチした部分の文字数が返される。\(\)で囲んでいる場合は副表現でマッチした文字列が返される
expr match "i love nirvana" ".*love" 6当然マッチした場合はNULLが返されて、終了コードは0以外となる
find /path/to \( -path '/path/to/.pythonbrew' -prune -o -path '/path/to/.virtualenvs' -prune \) -o -print
例えばfooディレクトリ以下の拡張子が.tmpのファイルを削除したい場合、
元ねたはhttp://d.hatena.ne.jp/lurker/20070117/1169039924
find /path/to/foo -type f -name '*.tmp' -exec rm {} \;などとするが、この場合だと *.tmp のファイルの数だけ rm が実行され、時間がかかる。 (*.tmpが10000個あるとrmが10000回実行されることになる)また、
rm /path/to/foo/*.tmp単純にこれでもよいが、*.tmpのファイル数があまりにも多すぎる場合、
argument list too longとエラーになるその場合は
getconf ARG_MAXfreebsdなら
sysctl -A kern.argmaxで調べられる。で上記の2例のような場合にxargsを使うとよい。findの例だと
find /path/to/foo -type f -name '*.tmp' | xargs -n100 rmこの場合だとxargsはrmの引数を100個受け取ってから実行するようになるので、rmの回数が極端に減る(実行速度も大幅に速くなるらしい)。rmの例の場合のように引数の制限に引っかかることもない。オプション -n(もしくは--max-args=max-args)は引数に受け取る数値。-n1とか指定がない場合は引数は1個ずつとなる。なので
find /path/to/foo -type f -name '*.tmp' | xargs -n1 rmは一番はじめに例にだしたfindの実行例と同じになる。その他xargsを使って並列処理を行ったりすることができたりする。ちなみにxargsした時にどんなコマンドを実行したか見たいときは -t をつければ確認することができる。
元ねたはhttp://d.hatena.ne.jp/lurker/20070117/1169039924
ls -lの結果で
-rw-r--r-- 1 root root 2 2009-01-01 19:15 ??????こんなことになってる場合は当然
rm ??????などとしても削除できない。そんなときはinodeを調べて削除する。まずinodeを調べる
ls -i 82170 ??????などとするとinodeがわかるので、あとはfindとxargsを組み合わせて削除する
find -inum 82170 -print0 | xargs -O rm -fとすると削除できる。findの出力オプションはかならず-print0をつけて、xargsで受ける時に-Oオプションをつけること。
xargsの-iオプションを指定する
# どっかのぱくりです。いい例が思いつかなかった find . -type f -print0 | xargs -0 -i mv '{}' /var/tmp/findでマッチしたファイルが{}の部分で展開され、/var/tmp以下に移動される。って意味になる
めんどくさいので http://codezine.jp/article/detail/3279 参照
cat sample.txt kurt foo bar foo hoge kurt hage bar bar holly kurt upo kurtこんなファイルがあったとして
sort sample.txt | uniq bar foo hage hoge holly kurt upoとしてsortしてuniqを使用すると重複した文字列は一度しか表示されない。もしくは
sort -u sample.txtとしても同じ結果となる
sortした状態にしてuniqを行う。この時に-cをつけると出現回数が表示される。この状態でさらにsort -nで先頭の数値順で並び替えるが、このままだと昇順になるので、降順にするには-rをつける。
と長ったらしい説明になったが
と長ったらしい説明になったが
sort sample.txt | uniq -c | sort -nr 4 kurt 3 bar 2 foo 1 upo 1 holly 1 hoge 1 hageとすると思い通りの結果を得ることができる
cat list.txt 1 holly 30 2 oton 58 3 okan 60 4 onii 31 5 tora 5 6 momo 3ID,名前,年齢ごとのデータを記述したファイルがあるとして、年齢で降順sortを行いたい場合は-kでsortを行うフィールドを指定する
sort -nrk 3 list.txt 3 okan 60 2 oton 58 4 onii 31 1 holly 30 5 tora 5 6 momo 3となる
よくyes/noを聞いてくるので無視したい。
The authenticity of host 'remote server (xxx.xxx.xx.xx)' can't be established. RSA key fingerprint is 77:69:25:f0:96:02:41:0b:bf:c9:88:fb:03:9b:55:44. Are you sure you want to continue connecting (yes/no)?とこういうのが出てくるのだけど、プログラム的にssh接続などをしているとこれが出るとプログラムがそこで止まってしまったりするので何とかしたいっていう場合
~/.ssh/known_hostsに無ければ登録する。これだと警告は出ない
if ! grep -q "remote_server" ~/.ssh/known_hosts 2>/dev/null; then # rsa or dsa ssh-keyscan -t dsa "remote_server" >> ~/.ssh/known_hosts fi
警告はでるけど無視する(たぶんセキュリティ的にはよくない)
ssh -o StrictHostKeyChecking=no -l account -i ~/.ssh/id_dsa remote_server
StrictHostKeyChecking=noを~/.ssh/configに記載しておく
cat <<EOL > ~/.ssh/config > Host * > StrictHostKeyChecking no > EOLオプション指定しなくても有効になる
接続先サーバに null パケットを送信して、無操作時に勝手に接続が切れてしまうのを防ぐ(sshdの設定がそうなっている場合があったりするので).ssh/configに以下を記載する
ServerAliveInterval 60
まずはパスワードなしの鍵を作成する
あとは対象サーバにパスワードなしでsshで接続できるか確認
# 標準では対話式だけど、コマンド一発でできるように ssh-keygen -t dsa -C "non password key" -N "" -f ~/.ssh/id_dsaこれで~/.ssh 以下に
-rw------- 1 hoge hoge 668 8月 24 20:57 id_dsa # 秘密鍵 -rw-r--r-- 1 hoge hoge 606 8月 24 20:57 id_dsa.pub # 公開鍵というファイルが生成される。生成された公開鍵のほうをパスワードなしでログインしたいサーバのアカウントのホームディレクトリ以下の~/.ssh/authorized_keys に追加する。追加後はid_dsa.pubは必要ないので削除。
あとは対象サーバにパスワードなしでsshで接続できるか確認
ssh -l account -i ~/.ssh/id_dsa remote_server
鍵をどうしてもパスワードありにしたい場合。まずは鍵を作る
あとは接続できるか確認
ssh-agent起動
ssh-keygen -t dsa -C "password key" -N "hogehoge" -f ~/.ssh/id_dsaid_dsa.pubをパログインしたいサーバのアカウントのホームディレクトリ以下の~/.ssh/authorized_keys に追加する。追加後はid_dsa.pubは必要ないので削除。ここは手順は同じ。
あとは接続できるか確認
ssh -l account -i ~/.ssh/id_dsa remote_server Enter passphrase for key '/home/hoge/.ssh/id_dsa': <- ここにパスワード入力とりあえずパスワード入力することでログインできることは確認。これで一度リモートからはログアウトし、ssh-agentを起動してみる。
ssh-agent起動
ssh-agent bashssh-agentに鍵の情報を覚えさす
ssh-add ~/.ssh/id_dsa Enter passphrase for key '/home/hoge/.ssh/id_dsa': <- ここにパスワード入力 Identity added: /home/hoge/.ssh/id_dsa (/home/hoge/.ssh/id_dsa) # これで再度ssh。パスワード入力なしでいけるはず ssh -l account -i ~/.ssh/id_dsa remote_serverちなみにssh-agentを落とすときは
eval $(ssh-agent -k)これでパスワードありでも無しとおなじような扱いで接続できる
/etc/ssh/ssh_configを参照
grep Cipher /etc/ssh/ssh_config # Cipher 3des # Ciphers aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc使用できる暗号化の方法とデフォルトがどれになっているかわかる。指定したい場合は
ssh -c aes128-cbc remotehostのようにすればよい。rsync + sshやscpなどの転送速度を気にする場合はcipherの指定をarcfourにすると早くなるようだ。ただし暗号化の強度は落ちるので自己責任。のようだ
archive.tarには以下のファイルがまとめられていて
tar tf archive.tar hoge.txt hogehoge.txt hogehogehoge.txthogehogehoge.txtだけ取り出したい場合
tar xf archive.tar hogehogehoge.txtというようにアーカイブのあとに取り出したいファイル名を指定する
totalsオプションを使う
tar --totals -cpvf archive.tar hogehoge.txt hogehogehoge.txt Total bytes written: 30720 (30KiB, 4.9MiB/s)
リストファイル指定オプションを使う(-T or --files-from FILE)
tar --totals --preserve -cvT archive.list -f archive.tararchive.listにはファイルリストを一行ずつ記述する
除外したいリストファイル指定オプションを使う(-X or --exclude-from FILE)
オプションで直接除外するのを指定する場合は--exclude FILEを指定
オプションで直接除外するのを指定する場合は--exclude FILEを指定
tar -cvX exclude.list -f archive.tar hogehoge.txt hogehogehoge.txt
日ごとの差分バックアップをとるのに便利
tar --newer "2008-11-23 18:50:00" -cvf archive.tar hogehoge.txt hogehogehoge.tx
アーカイブを取りたいファイル/ディレクトリが/home/hogeにある場合
cd /home/hoge tar cvf /backup/hoge.tar file1 file2 dir1 dir2とするのがめんどくさい場合-C, --directoryを指定する
cd /home/hoge tar -C /home/hoge -cvf /backup/hoge.tar file1 file2 dir1 dir2
tar -C /path/to -cpzf - . | ssh account@remote_server "tar -C /path/to xvfp -"これはすぐに展開してしまうパターン。どっちかというとローカルのファイル/ディレクトリをリモートにコピーみたいな感じ。tarballとしてリモートに転送したい。だけど、一度ローカルにtarball作りたくない場合は、
tar -C /path/to -cpzf - . | ssh account@remote_server "cat > /path/hogehoge.tar.gz"とするとよい
逆にリモートのディレクトリをtarballとしてローカルに転送したい場合は逆をすればよい
ssh account@remote "cd path && tar cpfz - ." > hogehoge.tar.gz
テキストファイルをバイナリでアップしてしまったりして、たまにテキストファイルの改行部分が^Mみたいなのがはいってしまった時に削除する
#^M はターミナルで Ctl+v Ctl+m を入力 sed -i 's/^M//g' crlf.txtこれで再度viで対象ファイルを開くと正常に削除されている
ホスト名を取得したい場合はhostnameコマンドでいけるが、IPアドレスを取得するコマンドなんてないので
/sbin/ifconfig eth0 | grep "inet addr" | sed -e 's/.*inet addr:\([0-9.]*\) .*/\1/'grepで結果を絞ってからsedする。interface部分は適時変更。linuxベースで確認しているので、ifconfigの結果が違う場合は当然使えない
昨日
unixtimeから日付。dateに@$unixtime だそうな
date --date 'yesterday'10日前
date '+%Y-%M-%d %T' --date '10 days ago'10年後
date '+%Y-%M-%d %T' --date '10 years'unixtime
date '+%s'指定した日付のunixtime
date '+%s' -d "2009-02-17 11:51:01"といろいろできるみたい
unixtimeから日付。dateに@$unixtime だそうな
date --date "@1325809488" "+%Y-%m-%d %H:%M:%S"
dateでもシステムの時間は変更できる
date -s '1999-12-31 11:59:59'のようにすると日付変更できる。ただしrootのみ(まあこんなことあんまりせんだろうけど。普通はntpdかntpdateでしょう)
標準入力(0)が、対話的なターミナルと関連づけられている場合は終了コードは0(正常終了)
if [ -t 0 ]; then echo "適当に出力 else # 標準入力で受け取ったデータをそのまま出力 cat - fi
標準入力が名前付きパイプなら終了コードは0(正常終了)
if [ -p /dev/stdin ]; then # 標準入力で受け取ったデータをそのまま出力 cat - else echo "適当に出力 fi /dev/stdinのかわりに/proc/self/fd/0, /dev/fd/0 でもいけるかも
ファイルが存在し、サイズが1byte以上
file="/path/to/file" if [ -s $file ]; then echo "\$file is exists and not zero length" fi
#hogehogeアカウントが起動している情報を表示する。ただし、一行目(見出し)は非表示 ps -U hogehoge -o 'user,uid,gid,pid,ppid,rss,command' --no-heading # hoge.plというスクリプトが起動している情報を表示 ps -C hoge.pl -o 'user,uid,gid,pid,ppid,rss,command' --no-headers # tree状に全体表示 ps axlf
- oで指定できるフィールド名。多いのでそのままコピペ
[-o format] -o オプションを使用すると、出力書式をユーザーが指定するこ と ができます。 出力書式は、空白またはコンマで区切った引数のリストで指定しま す。 各 変数にはデフォルトのヘッダーがあります。等号と新しい ヘッダーのテキストを追加することによって、デフォルト の ヘッ ダーを上書きできます。引数の残りの文字は、ヘッダーテキストと して使用されます。コマンド行で指定した順番でフィールドが書き 込まれ、カラムとして出力されます。フィールド幅は、少なくとも ヘッダーを表示できる幅 (デフォルト値または指定値) がシステム に よっ て選択されます。-o user=, のようにヘッダーテキストが NULL である場合、フィールド幅は少なくともデフォル ト の ヘッ ダーテキストを表示できる幅になります。すべてのヘッダーテキス トが NULL である場合、ヘッダー行が出力されません。 POSIX ロケールでは、次の名前が認識されます。 user プロセスの実効ユーザーID。テキストのユーザーID を取 得 でき、フィールド幅が足りる場合は、テキストのユーザーID になります。そうでない場合は、10 進数の ID に な り ま す。 ruser プロセスの実ユーザーID。テキストのユーザーID を取得 で き、 フィー ルド幅が足りる場合は、テキストのユーザーID になります。そうでない場合は、10 進数の ID に な り ま す。 group プロセスの実効グループ ID。テキストのユーザーID を取得 でき、フィールド幅が足りる場合は、テキストのユーザーID になります。そうでない場合は、10 進数の ID に な り ま す。 rgroup プロセスの実グループ ID。テキストのユーザーID を取得で き、 フィー ルド幅が足りる場合は、テキストのユーザーID になります。そうでない場合は、10 進数の ID に な り ま す。 pid プロセス ID の 10 進数値。 ppid 親プロセス ID の 10 進数値。 pgid プロセスグループ ID の 10 進値。 pcpu 最近のある期間において、使用できる CPU 時間に対して 実 際 に使用された CPU 時間の割合 (単位: %)。「最近」およ び「使用できる CPU 時間」は不定で、場合によって異な り ます。 vsz 仮想メモリー中のプロセスの合計サイズ (単位: キロバイト )。 nice プロセスの、システムスケジューリング優先順位を表す 10 進数値。nice(1) を参照してください。 etime POSIX ロケールにおける、プロセスが開始されてからの経過 時間。書式は次のとおりです。 [[dd-]hh:]mm:ss dd 日 hh 時間 mm 分 ss 秒 dd フィールドの値は 10 進の整数です。hh、mm、ss フィー ル ド は、ゼロによって左揃えされた 2 桁の 10 進整数です。 time POSIX ロケールにおける、プロセスの累積 CPU 時間。書 式 は次のとおりです。 [dd-]hh:mm:ss dd、hh, mm、ss フィールドは、etime と同様です。 etime の説明を参照してください。 tty プロセスの制御端末の名前。書式は who(1) コマンドによっ て使用されるものと同じです。 comm 実行されているコマンドの、文字列としての名前 (argv[0] の値)。 args 文字列としての、コマンドとそのすべての引数。実装によっ てフィールド幅までに切り捨てられることがあります。これ は実装に依存します。この文字列が、コマンドが起動された ときにコマンドに渡された引数であるか、またはアプリケー ションによって変更された引数であるかは、不定です。アプ リ ケーションは、引数リストを変更できて、その変更を ps の出力に反映することに依存しません。Solaris 実装では、 この文字列は 80 文字以内に限定され、コマンドが起動され たときにコマンドに渡された引数となります。 Solaris 実装では、次の名前が認識されます。 f プロセスに関連付けられたフラグ (16 進数、加法的)。 s プロセスの状態。 c スケジューリングのためのプロセッサ利用 (旧仕様) uid プロセスの実効ユーザーID (10 進整数) ruid プロセスの実ユーザーID (10 進整数) gid プロセスの実効グループ ID (10 進整数) rgid プロセスの実グループ ID (10 進整数) projid プロセスのプロジェクト ID (10 進整数) project プロセスのプロジェクト ID (取得できる場合はテキス ト。 そうでない場合は 10 進整数) sid セッションリーダーのプロセス ID taskid プロセスのタスク ID class プロセスのスケジューリングクラス pri プロセスの優先順位 (数値が大きいほど優先順位が高い) opri プロセスの廃止優先順位 (数値が小きいほど優先順位が高い ) lwp lwp ID (10 進数)。1 行に 1 つの進行中の軽量プロセス が 示されます。 nlwp 軽量プロセスの数 psr プロセスまたは軽量プロセスがバインドされているプロセッ サの数 pset プロセスまたは軽量プロセスがバインドされているプロセッ サセットの ID addr プロセスのメモリーアドレス osz 仮想メモリー中のプロセスの合計サイズ (単位: ページ) wchan プロセスが休止中のイベントのアドレス (- の場合、プロセ スは動作中) stime プロセスの開始時刻または開始日。空白なしで出力さ れ ま す。 rss プロセスの常駐の設定サイズ (単位: キロバイト) pmem マシン上の物理メモリーに対する、プロセスの常駐の設定サ イズの割合 (単位: %) fname プロセスの実行可能ファイルのベース名の先頭 8 バイト comm および args だけに、空白文字を含めることがで き ま す。 Solaris 実装の変数およびその他すべての名前には、空白文字を含 めることができません。 POSIX ロケールで使用されるデフォルトヘッダーとそれに対応する 書式指定子は、次のとおりです。 __________________________________________________________________ | 書式 デフォルト | 書式 デフォルト | | 指定子 ヘッダー | 指定子 ヘッダー | | args COMMAND | ppid PPID | | comm COMMAND | rgroup RGROUP | | etime ELAPSED | ruser RUSER | | group GROUP | time TIME | | nice NI | tty TT | | pcpu %CPU | user USER | | pgid PGID | vsz VSZ | | pid PID | | |________________________________|________________________________| Solaris 実装における書式指定子と対応するデフォルト ヘッ ダー は、次のとおりです。 __________________________________________________________________ | 書式 デフォルト | 書式 デフォルト | | 指定子 ヘッダー | 指定子 ヘッダー | | addr ADDR | projid PROJID | | c C | project PROJECT | | class CLS | psr PSR | | f F | rgid RGID | | fname COMMAND | rss RSS | | gid GID | ruid RUID | | lwp LWP | s S | | nlwp NLWP | sid SID | | opri PRI | stime STIME | | osz SZ | taskid TASKID | | pmem %MEM | uid UID | | pri PRI | wchan WCHAN | |________________________________|________________________________| 【使用例】 例 1: ps コマンドの例 example% ps -o user,pid,ppid=MOM -o args 上記のコマンドによって、POSIX ロケールでは以下の内容が出力さ れます。 USER PID MOM COMMAND helene 34 12 ps -o uid,pid,ppid=MOM -o args 切り捨てが発生する可能性があるため、COMMAND の内容は必ずしも 上記の例と一致しません。 【環境】 ps の実行に影響を与える環境変数 LC_CTYPE、 LC_MESSAGES、 LC_TIME、NLSPATH についての詳細は、environ(5) を参照してくだ さい。 COLUMNS 画面の水平方向のサイズとして、システムが決定する値の代 わりに使用する値を定義します。この値により、表示するテ キストカラム数が決まります。正直、オプションが多すぎるので詳細は
- http://www.linux.or.jp/JM/html/procps/man1/ps.1.ht...
- http://x68000.q-e-d.net/~68user/unix/pickup?ps
- http://www.k-tanaka.net/unix/ps.html
- http://d.hatena.ne.jp/youichi/20061003
viのswapファイルはどのユーザーが使っているプロセスか調べる。-uで誰が使用しているかわかる
/sbin/fuser -u /home/holly/.hoge.pl.swp /home/holly/.hoge.pl.swp: 8372(holly)どのプロセスもつかんでいない場合は何も表示されない
/sbin/fuser -k /home/holly/.hoge.pl.swpデフォルトでシグナルはSIGKILLが送信されるので変更したい場合は
/sbin/fuser -k /home/holly/.hoge.pl.swp -TERMなどと指定する。killするか確認する場合は
/sbin/fuser -i -k /home/holly/.hoge.pl.swp -TERM-iを指定するとkillする前に確認メッセージが表示される
/sbin/fuser -nc tcp 25 USER PID ACCESS COMMAND 25/tcp: root 1541 F.... master-nはtcp/udpなどを指定するためのオプション。-cはマウントポイントおよびそのマウントポイントの下にあるファイルの使用状況を表示。この場合だとpostfixのmasterプロセスが使用していることがわかる
実効ユーザー、完全なコマンドライン名でpgrepする場合は
pgrep -u holly -x -l -f "/usr/bin/perl /home/admin/hoge.pl"とする。オプションはこんな感じ
- -u プロセスを動かしているユーザー名を指定
- -f デフォルトはプロセス名にマッチだが、コマンドライン全体にマッチする
- -x -fで指定した完全一致したプロセス名(コマンドライン)にマッチする
- -l プロセス名を表示する
pkill -u admin -x -f "/usr/bin/perl /home/admin/hoge.pl"あいまい指定でもkillできるけど、killしたくないプロセスまでkillしてしまう可能性があるので、この方が確実。pgrepで一度確認するのがよい。
デフォルトではTERMなので指定したい場合は
pkill -KILL -u admin -x -f "/usr/bin/perl /home/admin/hoge.pl"のようにkillと同じような指定方法でいい
こんなスクリプトがあったとして
diffの結果からpatchファイルを作ることができるので
# test.sh #!/bin/sh date=$(date +%Y%m%d-%H%M%S) echo "now is $date"こんなのに変更した
#test_new.sh #!/bin/sh echo "now is $(date +%Y%m%d-%H%M%S)"変更分の差分をとりたい場合
diff -u test.sh test_new.sh --- test.sh 2008-09-04 00:59:06.000000000 +0900 +++ test_new.sh 2008-09-04 01:01:25.000000000 +0900 @@ -1,4 +1,3 @@ #!/bin/sh -date=$(date +%Y%m%d-%H%M%S) -echo "now is $date" +echo "now is $(date +%Y%m%d-%H%M%S)"とすると差分が表示される。出力形式はいろいろあるが、-nがなんとなくわかりやすい。
diffの結果からpatchファイルを作ることができるので
diff -u test.sh test_new.sh > test.patchとするとpatchファイルのできあがり。test_new.shを削除したあと
patch -p0 -d . < test.patchとするとtest.shはpatchがあたり、test_new.shとの差分がなくなる
ディレクトリ内部のファイル全てに対してdiffしたい場合は
ただし↑の方法では一方にしか存在しない、つまり追加または削除されたファイルは記録されないので、追加または削除されたファイルも記録するためには以下のようにする
diff -ru dir1 dir2 diff -ru dir1/a/b/hogehoge.txt dir2/a/b/hogehoge.txt --- dir1/a/b/hogehoge.txt 2008-09-04 01:07:38.000000000 +0900 +++ dir2/a/b/hogehoge.txt 2008-09-04 01:08:12.000000000 +0900 @@ -1 +1,2 @@ hogehoge +alalala Only in dir2: aaa.txtオプションに-rを付けると再帰的にdiffしてくれるが差分結果がぞろぞろと出てきてしまうので、
diff -rq dir1 dir2 Files dir1/a/b/hogehoge.txt and dir2/a/b/hogehoge.txt differ Only in dir2: aaa.txtオプションに-qを付けると詳細な差分は表示されなくなる。
ただし↑の方法では一方にしか存在しない、つまり追加または削除されたファイルは記録されないので、追加または削除されたファイルも記録するためには以下のようにする
diff -ruN dir1 dir2 > dir.patchオプションに-Nを付けると、ディレクトリを比較する際、片方のディレクトリにのみファイルが存在していたらもう片方のディレクトリには同名の空っぽのファイルがあるように動作する。これでディレクトリ単位のpatchファイルを作成可能。戻すときはファイルのpatch手順と同じでよいが、ファイルの追加はされても削除が行われません。ファイルの削除も再現するには以下のように-Eをつける
patch -p0 -d . -E < dir.patch
オプション-qもしくは--briefを使う。ディレクトリ単位でdiffする場合はたいがいファイルの詳細な差分情報はいらないので(ファイルが違うかどうかだけ知りたいので)このオプションを使うと内容が違う、もしくは片方のディレクトリにしかないファイルの名前のみでてくる。
#-rはディレクトリを再帰的に diff -rq /path/to/foo /path/to/bar Files /path/to/foo/hoge.pl and /path/to/bar/hoge.pl differ Only in /path/to/foo: hage.plFilesから始まっている行は違いのファイル同士。Onlyから始まっているのは片方のディレクトリにしかないファイル
eucのファイルをutf8で表示する。PAGERとしてlessが使われているっぽい
さらに指定する文字コード
lv -Iej -Ou8 euc.txtよく使うオプション
- -I 入力文字コード
- -O 出力文字コード
さらに指定する文字コード
- a auto-select
- c iso-2022-cn
- j iso-2022-jp
- k iso-2022-kr
- ec euc-china
- ej euc-japan
- ek euc-korea
- et euc-taiwan
- u7 UTF-7
- u8 UTF-8
- l1..9 iso-8859-1..9
- l0 iso-8859-10
- lb,ld,le,lf,lg iso-8859-11,13,14,15,16
- s shift-jis
- b big5
- h HZ
- r raw mode
リダイレクトで書き出すとファイルの文字コード変換することができる
lv -Iej -Ou8 euc.txt > utf8.txt一括で複数のファイルの文字コードを変換したい場合は
for f in *.txt; do conv=$f.utf8 lv -Ia -Ou8 $f > $conv mv -f $conv $f done
最近のOSだとデフォルトで入ってるのかも。ランダムな文字列(みたいなの?)を生成したい場合
uuidgen a53d7838-3c53-4b02-a98f-b4b0679f3a45これだけでいいんだけど、このうちの先頭8byteだけでいいし、-(ハイフン)はいらない場合は
uuidgen | sed -e 's/-//g' | cut -c 1-8 186ec9d1こんなふうにmd5の結果っぽくなるので、それなりにランダムっぽい文字列を作りたい場合は、perlねたのランダムな文字列を生成したいを見るとよい
cdとにたようなことをするが、実行時のカレントディレクトリと行き先のディレクトリをディレクトリスタックに保存する
# /binに移動 pushd /bin # /usr/binに移動 pushd /usr/bin # /varに移動 pushd /var引数なしで実行した場合は、ひとつ前のディレクトリに戻り、実行時のカレントディレクトリはディレクトリスタックのいちばん前に回される。
ディレクトリスタックに保存している内容を表示する
dirs /var /usr/bin /bin ~何がうれしいかというと今まで移動したディレクトリの名前が/path/to/long/path/nameと長ったらしい名前だとして、戻りたい場合にcd /path/to/long/path/name/.... などと入力しなくてもディレクトリスタックに移動した場所が保存されているので、簡単に戻ることができる。/usr/binに戻りたい場合はディレクトリスタックインデックスが1なので(配列の添え字の考え方と同じ。前から0番目)
pushd +1とするだけで戻ることができる。
こんなもん作ることないだろうと思いつつ、最近いろいろとお世話になっているので
dd if=/dev/zero of=sparse.txt seek=1024 bs=100M count=0これで100GBの穴あきファイルが作成できる。穴あきファイルをlsすると
LANG=C ls -hl sparse.txt -rw-r--r-- 1 root root 100G Dec 1 01:09 sparse.txtといっけん100Gのファイルのようにみえるが
LANG=C ls -hsl sparse.txt 0 -rw-r--r-- 1 root root 100G Dec 1 01:09 sparse.txtブロックサイズを確認するとまったく使用されていないことがわかる。du, dhなどでも同じ結果になる
8進dumpとか16進dumpとかする。たまに使う。デフォルトだと8進数dumpだけになる
cat hello.txt hello worldこれをodすると
od hello.txt 0000000 062550 066154 020157 067567 066162 005144 0000014となる。正直よくわからないので
od -tcx1 hello.txt 0000000 h e l l o w o r l d \n 68 65 6c 6c 6f 20 77 6f 72 6c 64 0a 0000014tcx1がおすすめ。どこかでみた。がそのとおり
x[長さ] 16進数表記 d[長さ] 10進数表記 o[長さ] 8進数表記 c 文字表記 (改行コードなどは \r や \n のように表記) a 文字表記 (改行コードなどは CR や LF のように表記)長さはデフォルトで2byteになるので整理すると↓のようになる
-tx1 … 1バイト単位で 16進数表記 -tx2 … 2バイト単位で 16進数表記 -tx4 … 4バイト単位で 16進数表記 -td1 … 1バイト単位で 10進数表記 -td2 … 2バイト単位で 10進数表記 -td4 … 4バイト単位で 10進数表記 -tx … (省略したので) 2バイト単位で 16進数表記 -td … (省略したので) 2バイト単位で 10進数表記
たとえば100行あるファイル(num.txtとする)を10行ずつに分割したい場合は
split -l 10 num.txtとする。lsすると
num.txt xaa xab xac xad xae xaf xag xah xai xajと存在している。復元したい場合は
cat xa* > num.txt.concatとするとよい。ハッシュ値をmd5sumで確認すると同じになっていることが確認できる
デフォルトではxa**となるようなので、自分で指定したい場合はprefixを指定する
split -l 30 num.txt split.と指定した場合は
split.aa split.ab split.ac split.adと分割されるようになる
- Sを指定する。実行したいコマンドなども標準入力から受け付けるようだ
echo -e 'password\ncat /etc/shadow' | sudo -S -ssudoのデフォルト設定だと5分間は一度認証成功するとその後はパスワード聞かれないので、5分以内に2回目の実行をする場合は注意。上記例で実行すると
/bin/bash: line 1: password: command not found uid=0(root) gid=0(root) 所属グループ=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)とコマンドとして認識される
-L --location 指定しなくてもよさそうだが。URLを指定 -O --remote-name remote-nameでローカルに保存する -o --output 保存するファイル名 -s --silent 出力を抑制 --insecure httpsでアクセスする時に怪しい証明書でもエラーにしない -A --user-agent --user 引数なしだと対話形式 <user>を指定した場合は対話形式でパスワード、<user>:<pass> で指定した場合は対話はなく実行 -1/--tlsv1 Use TLSv1 (SSL) -2/--sslv2 Use SSLv2 (SSL) -3/--sslv3 Use SSLv3 (SSL) -d/--data <data> formdataを渡す。こんな感じで。"name=Rafael%20Sagula&phone=3320780" -e/--referer referer
GETはいいとしてPOST/PUT/DELETEしたい。特にPUT/DELETE
curl -X PUT --data name=kurt --data band=nirvana http://$apiurl/Xオプションでメソッドを指定すればよい。POSTは明示的に指定しなくても--dataがあればPOSTとみなされる
たいがい「ajaxならば」な処理でjsonを返す処理をしているのがおおいはず。
X-Requested-With: HTTP_X_REQUESTED_WITH or XMLHttpRequest or XmlHttpRequestを含んでいれば、xhrな処理をしてくれるはずなので
# cakephpで構築したやつの場合。ログイン認証cookieとxhrなrequest headerを送る。ついでにuseragentもおくる curl -H "Cookie: CAKEPHP=xxxxxxxx" -H "X-Requested-With: HTTP_X_REQUESTED_WITH" -A "Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20100101 Firefox/4.0" -v -X POST http://$domain/show/:idというふうに-Hにrequest headerを指定する
もちろん/etc/passwdと表示される
file=../../../etc/passwd echo $(cd $(dirname $file) && pwd)/$(basename $file)
よく使う。CPUの優先率を操作。-20(最優先)から19(一番あと)まで指定
# -20 とかで指定したい場合は nice -n -20 /path/to/command とする # -nは--adjustment=Nでもよい nice -n10 /path/to/command
niceを書いたからおまけ。すでに動いているプロセスの優先度を変更
renice [adjustment] -p $PIDその他、プロセスに対してではなく
-u $user -g $processgroup || というような指定もできるようだ **ionice 最近知った =|BOX| ionice -c2 -n7 /path/to/command使い方。-nが優先度で数値が大きいほど実行度が後回しになる。scheduling classはよくわからないが、3は他のプロセスがioに負荷を少しでもかけている場合はそれが終わるまで待つらしい。ただしそのプログラムが終わらない。ということになりかねないのであんまりやらないほうがいいような気がする
-n Class data (typically 0-7, lower being higher prio) -c Scheduling class 1: realtime, 2: best-effort, 3: idle -p Process pid -h This help page
どこかで見たやつをそのまま。
rsync --bwlimit=3096 --rsync-path="ionice -c2 -n7 nice -n19 rsync" -ave "ssh -c arcfour" /backup/ remote:/path/to/backup/
年に何回かは出番がくる。例
# -n 接続元のIPアドレスの名前解決をしない # -x 16進数で表示 # -X ASCIIで表示 # -i dumpするinterfaceを指定 # -s パケットから取り出すデータの長さ。byte指定 tcpdump -nxX -i eth0 -s2000 port 80
wをつける
tcpdump -nxX -i eth0 -s2000 -w tcpdump-bin.log port 80出力した結果はそのままではよめないので、
tcpdump -n -r tcpdump-bin.logとすると読めるようになるがよくわからないので、調べておく。あまりみることないと思うし
hostの前などにつけると、送信だけ(src)、受信だけ(dst)、というように挙動を変更できる。デフォルトは双方向キャプチャしている
# $hostからの接続でport80なら tcpdump -nxX -s2000 -vv host $host and dst port 80 # $hostへの接続でport80なら tcpdump -nxX -s2000 -vv src host $host and port 80http://www.tcpdump.org/tcpdump_man.htmlをみればわかるが、udpやsubnet単位でのキャプチャも可能
タグ
最新コメント