よく使うコマンドや使い方を忘れそうなコマンドをメモ
バッテリの残量を表示
$ sudo apt-cache gencaches
パッケージ情報の収集、更新。
$ apt-cache search キーワード
キーワードに検索したい文字列を入れてパッケージを検索。
$ apt-cache show パッケージ名
パッケージの情報を表示。
$ apt-cache showpkg パッケージ名
パッケージの依存関係などを表示。
$ sudo apt-get install パッケージ名
パッケージをインストール
$ apt-get source libc6
libc6のソースコードをダウンロード
historyを検索: Ctrl+r
計算機的なもの
ログインシェルを変更する。
$ sudo chsh ユーザ名
このあと、使用するシェルのパスを入力する。例えば /bin/bash など。
ファイルシステムの使用容量を表示。
-h オプションをつけると人間に見やすい単位で表示する。
$ sudo dhclient
DHCPでIPアドレスを取得する。
事前にダウンロードしてあるパッケージをインストールするためのコマンド。
$ dpkg -l
インストールされているパッケージ一覧を出力する。
$ dpkg -l パッケージ名
指定したパッケージがインストールされているか確認できる。
インストールされていなかったら「No packages found matching パッケージ名」などと出力される。
$ dpkg -L パッケージ名
パッケージがどこにインストールされているか表示する。
インストール済みパッケージの再設定。
$ sudo dpkg-reconfigure console-setup
キーボードマッピングなどの再設定。
ファイルやディレクトリの容量を表示する。
指定したディレクトリの総容量を表示(Kバイト単位)
$ du -s ディレクトリ名
hオプションをつけるとわかりやすい単位で表示
$ du -sh ディレクトリ名
カレントディレクトリのギガバイト級のファイルかディレクトリを表示
$ du -h | grep [0-9]G
ELF binary と shared library のスタック実行可能フラグをsetしたりclearしたりする。
$ execstack -q filename
filename にマーク(flag)がついているか調べる。(--query)
- はスタック実行不可、
X はスタック実行可能。
$ execstack -s filename
スタック実行可能にする。(--set-execstack)
$ execstack -c filename
スタック実行不可にする。(--clear-execstack)
最近のgccではexecstackコマンドを使わなくても自動的にマークを行う。
アセンブル時に設定したい場合は --execstack または --noexecstack
リンク時に設定したい場合は -z execstack または -z noexecstack
を指定する。
参考
http://linux.die.net/man/8/execstack
execstackはstackという名前がついてるけども、bss、data、ヒープにも有効らしいぞ。
参考
http://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c905.html
ファイルのタイプを判定する
-fstack-protector
stack smashing attack を防ぐためのオプション。
たぶんカナリア値(canary value)みたいなものを付加してreturnアドレスなどの改竄を検出したらプログラムを終了させる。
manによるとUbuntu 6.10以降はデフォルトで有効になっている。
無効にするには -fno-stack-protector または -nostdlib オプションをつける。
-fstack-protector をただ単に無効にしたいだけなら -fno-stack-protector がよさそう。
-z execstack
スタック上にあるコードの実行を許可する。
ところでこのオプション、manに載ってないんだけどなんなの。
-v
gccの動作を表示する。
例えばincludeのときにどこのパス探しに行ってるとかわかる。
起動
$ gdb <デバッグするバイナリ>
引数の指定
(gdb) set args <指定する引数>
mainにbreakpointセット
(gdb) b main
main.cの100行目にbreakpointセット
(gdb) b main.c:100
breakpoint一覧
(gdb) info b
breakpoint削除
(gdb) delete <breakpoint番号>
実行開始
(gdb) r
一行分進める(関数には入らない)
(gdb) n
一行分進める(関数に入る)
(gdb) s
関数が終わるまで進める
(gdb) finish
変数の値の表示
(gdb) p <変数名>
stack traceの表示
(gdb) bt
スレッド一覧
(gdb) info threads
レジスタの値一覧
(gdb) info register
逆アセンブル
(gdb) disassemble
現在の実行位置から10byte分の逆アセンブル
(gdb) disassemble $rip,+10
覚えておくとよいこと
何か設定するとき
(gdb) set ほにゃらら
設定可能なものの一覧
(gdb) help set
設定を参照するとき
(gdb) show ほにゃらら
その他の情報を参照するとき
(gdb) info ほにゃらら
参照できる情報一覧
(gdb) help info
小技
何も入力せずにエンター押すと前と同じコマンドが実行される。
間違えてaddなどしたのを取り消すには?
git reset ファイル名
↑ファイル名を取り消し
git reset .
↑カレントディレクトリ以下すべて取り消し
ローカルファイルへの全ての変更を取り消すには?svn revert的な?
git reset --hard HEAD
あるファイルを編集前の状態に戻すには?
git checkout ファイル名
remoteにあるbranchをコピーするには
$ git clone git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git
しているとします。これでmaster branchがローカルにできます。
まず
$ git branch -r
とか
$ git branch -all
で存在するbranchを確認します。
next branchが欲しい場合、
$ git branch next
でローカルにbranchを作成します。
$ git pull git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git next
でremoteのnext branchを取ってきます。
lkmlなどに投稿するパッチを生成するには
git format-patch
# gpasswd -a ユーザ名 グループ名
ユーザをグループに追加
# gpasswd -d ユーザ名 グループ名
ユーザをグループから削除
新しいgroupを作る。
# groupadd グループ名
実行ファイルが使用しているシェアドライブラリー(shared library)を表示する
$ ldd hello
linux-gate.so.1 => (0xb7fbd000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e52000)
/lib/ld-linux.so.2 (0xb7fbe000)
みたいな。
ln
リンクを作成する。
カレントディレクトリに /temp/aaa というディレクトリまたはファイルのシンボリックリンクを作りたい場合
$ ln -s /temp/aaa
コマンドのマニュアルを表示。
また、例えば、
$ man whoami
とすると、
whoami(1)
というのが表示される。この(1)というのはそれがユーザーコマンドであるという意味。
システムコールの場合は(2)と表示されるらしい。試しに
$ man geteuid
あれ、manがないって言われる。どういうこっちゃ・・・
試しにFreeBSDでやったら見れた。
Ubuntuだとデフォルトでは入っていないようだ。
$ sudo apt-get install manpages-dev
でインストールできた。
これでシステムコール(2)とファイブラリコール(3)のmanも見れるようになる。
日本語のmanは
$ sudo apt-get install manpages-ja manpages-ja-dev
でインストールできる。
manの言語は環境変数LANGによって変更できる。
日本語で表示したいときは
$ export LANG=ja_JP.UTF-8
英語で表示したいときは
$ export LANG=en_US.UTF-8
とすればよい。
また、一時的に表示する言語を変更したい場合には、 -L オプションで
$ man -L en_US.UTF-8 man
などとしてもよい。
writeなどのようにユーザーコマンドにもシステムコールにも該当するような項目は、デフォルトだと1つしか表示されないので、目的のものが表示されない場合は -a オプションをつける。
-a オプションをつけると最初の項目を閉じたあとに次の項目をEnterで開くことができる。
もしくは
$ man 2 write
とするとシステムコール
$ man 1 write
とするとユーザーコマンドが表示される。
文字列の検索は /(スラッシュ)を押したあとに検索したい文字列を入力してエンター。
続けて同じ文字列で検索する場合にはn。
行き過ぎたらShift+nで1個前に戻る。
-O
OSの検出。
-sV
サービスの詳細を検出。
-A
-O と -sV を両方使う。
-oG
grep形式で出力する。
$ nmap -oG ファイル名 ターゲット
ファイル名に出力先のファイル名を指定する。
-oS
leetで出力する。
user-agentの変更
--script-args http.useragent="user agent"
みたいなオプションをつけて起動すればよい。
野良ビルドしたら
undefined reference to `nl_handle_destroy'
と言われてコンパイルエラーになった。
./configure LIBS=-lnl
としてmakeしたらコンパイルできた。
これでいいのかは知らない。
参考:
Nmap Development: Re: nping/libpcap build error
http://seclists.org/nmap-dev/2012/q1/370
オブジェクトファイルの情報を表示する。
-d オプションで命令部分を逆アセンブル(disassemble)する。
-D オプションで命令部分に限らずデータ部分とか全部逆アセンブルする。
openoffice.orgの起動コマンド
引数にファイル名でおそらくそのファイルに適切なオフィスソフトを開く。
$ oowriter
でwriter、
$ oocalc
でcalcを開く。
$ openssl dgst -md5 ファイル名
指定したファイルのハッシュ値(md5)を計算する。
md5以外にも md4, md2, sha1, sha, mdc2, ripemd160, dss1 など指定できる模様。
audio inputをそのままoutputしたいとき
# pactl load-module module-loopback
これでIDが出力される。
やめるときは
# pactl unload-module 出力されたID
でループバックおわる。
参考:
[SOLVED] karmic pulseaudio line-in to analog-out - Ubuntu Forums
http://ubuntuforums.org/showthread.php?t=1324135
パスワードを変更する。
$ passwd ユーザ名
で、ユーザを変更せずに他のユーザのパスワードを変更できる。
$ printf "\x41\x42\x43\x44\n"
ABCD
みたいな感じでバイナリを文字列として出力することができる。
また
$ ./program `printf "\x64\x88\x04\x08"`
のようにすることで、プログラムの引数にアドレスを渡すことができる。
パスワードにできるような文字列を生成する。
$ pwgen 8 1
8文字の文字列を1つ生成する
タスク一覧表示
$ rake -T
インストールしたあるパッケージのファイルリストの表示
$ rpm -ql <パッケージ名>
windowの切り替え
C-a n またはC-a p
windowの一覧
C-a w
現在のwindowを削除
C-a k
regionを上下で分割
C-a S
regionを左右で分割
C-a |
regionのfocusの移動
C-a Tab
スクロール
C-a Esc 押したあとjやkでカーソル移動できるようになる。終了はEsc
今あるスクリーンに再アタッチ
$ screen -d -r
コピーとペースト
C-a Esc でコピーモードに入れる。
領域の選択は開始位置でspace, 終了位置でspace。
C-a ] でペースト。
1文字置換
sed y/a/b/ text.txt
aaabbbcccaaa → bbbbbbcccbbb
パターンを置換(最初に該当したひとつのみ)
sed s/aaa/bbb/ text.txt
aaabbbcccaaa → bbbbbbcccaaa
なぜかcygwinのsedだと全部置換されちゃうんだけどなんなの。
パターンを置換(全部)
sed s/aaa/bbb/g text.txt
aaabbbcccaaa → bbbbbbcccbbb
ファイル中の表示可能な文字列を表示
実行時のカーネルパラメータを設定
設定は一時的なものなので、デフォルトにしたいときには /etc/sysctf.conf を編集する。
このコマンドでパラメータをいじることは /proc/sys/kernel 内のファイルの内容をいじるのと同じこと。
例:randomize_va_spaceの値を確認する。
$ sysctl -n kernel.randomize_va_space
例:randomize_va_spaceを0にしてASLRを無効にする。
$ sudo sysctl -w kernel.randomize_va_space=0
これで/proc/sys/kernel/randomize_va_space の値が書き換わる。
例:aaa.logの更新をリアルタイムで見る
$ tail -f aaa.log
t
アーカイブの内容の一覧を表示。
x
アーカイブの展開。
f
ファイルの指定。
v
処理したファイルの一覧を詳しく表示。
$ tar xvf ファイル名
ファイル名に指定したアーカイブファイルを展開する。
$ tar tvf ファイル名
ファイル名に指定したアーカイブファイルの内容の一覧を表示する。
空のファイルを作成したりファイルのアクセス時刻や修正時刻を変更できる。
例:空のファイルを作成
$ touch test.txt
システムの情報を表示する。
-a 全ての情報を表示
-r カーネルのバージョンを表示
l
rarの中のファイルのリストを表示。
e
rarを展開。
-l
zipファイルの中にあるファイルのリストを表示。
-d DIRECTORY
DIRECTORYというディレクトリの中にファイルを展開する。
ログインしているユーザーとそのユーザーが実行しているものを表示。
ウェブページを取得するコマンド
例:ウェブサイトをまるごとローカルに保存
$ wget -r -np -m -k http://aaaaaaaaaaaaaa.com
引数に指定したコマンドのバイナリ、ソース、manページの場所を示す。
拡張子 .gz などのgzip圧縮されたファイルの中身を見る。
gunzip -c と同じ。