ubuntu 12.04ならインストールは、apt-getで一発
1 |
$ sudo apt-get install fonts-inconsolata |
後はgnome-terminalなどで、フォントを指定するだけ。
C言語を挫折した人間なので、バイナリとかアセンブラとかは全く分からない。
スクリプト言語サイコーなのだが、どうしたってサーバを動かしていれば
C言語で書かれた、デーモンやら何やらでトラブルは起きる。
先日もデーモンプログラムで、どうも変な挙動をしていたのだが
古いプログラムで、しかもソースから入れていることもあって
なんとか自力で原因究明しなくてはならなくなった。
元々、デバッグ情報付きでコンパイルされてなく
オプションを付けてコンパイルしなくてはならなかったのだが
付けたはずのオプションが、どっかで無効になったのか
gdbで実行すると、デバッグ情報が無いよ! と怒られまくった。
デバッグ情報が付かなかったのは、Makefile内の修正箇所ミスだったのだが
都度gdbを実行してから怒られており、もっと簡単に知る方法はないのかと調査した。
1 |
$ readelf -S 実行ファイル |
だそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
$ readelf -S httpd There are 36 section headers, starting at offset 0x4f96dc: Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .interp PROGBITS 08048114 000114 000013 00 A 0 0 1 [ 2] .note.ABI-tag NOTE 08048128 000128 000020 00 A 0 0 4 [ 3] .hash HASH 08048148 000148 009430 04 A 4 0 4 [ 4] .dynsym DYNSYM 08051578 009578 015070 10 A 5 1 4 [ 5] .dynstr STRTAB 080665e8 01e5e8 015ea1 00 A 0 0 1 [ 6] .gnu.version VERSYM 0807c48a 03448a 002a0e 02 A 4 0 2 [ 7] .gnu.version_r VERNEED 0807ee98 036e98 0000a0 00 A 5 3 4 [ 8] .rel.dyn REL 0807ef38 036f38 000060 08 A 4 0 4 [ 9] .rel.plt REL 0807ef98 036f98 0015c8 08 A 4 b 4 [10] .init PROGBITS 08080560 038560 0000e7 00 AX 0 0 16 [11] .plt PROGBITS 08080648 038648 002ba0 04 AX 0 0 4 [12] .text PROGBITS 08083200 03b200 0f73a4 00 AX 0 0 64 [13] .fini PROGBITS 0817a5a4 1325a4 00001b 00 AX 0 0 4 [14] .rodata PROGBITS 0817a5c0 1325c0 043ddc 00 A 0 0 32 [15] .eh_frame_hdr PROGBITS 081be39c 17639c 00004c 00 A 0 0 4 [16] .eh_frame PROGBITS 081be3e8 1763e8 00021c 00 A 0 0 4 [17] .data PROGBITS 081bf620 176620 011640 00 WA 0 0 32 [18] .dynamic DYNAMIC 081d0c60 187c60 000118 08 WA 5 0 4 [19] .ctors PROGBITS 081d0d78 187d78 000008 00 WA 0 0 4 [20] .dtors PROGBITS 081d0d80 187d80 000008 00 WA 0 0 4 [21] .jcr PROGBITS 081d0d88 187d88 000004 00 WA 0 0 4 [22] .got PROGBITS 081d0d8c 187d8c 000af4 04 WA 0 0 4 [23] .bss NOBITS 081d1880 188880 00822c 00 WA 0 0 32 [24] .comment PROGBITS 00000000 188880 0059cd 00 0 0 1 [25] .debug_aranges PROGBITS 00000000 18e250 000b18 00 0 0 8 [26] .debug_pubnames PROGBITS 00000000 18ed68 00c7a5 00 0 0 1 [27] .debug_info PROGBITS 00000000 19b50d 2ee565 00 0 0 1 [28] .debug_abbrev PROGBITS 00000000 489a72 0125c5 00 0 0 1 [29] .debug_line PROGBITS 00000000 49c037 02d6a8 00 0 0 1 [30] .debug_frame PROGBITS 00000000 4c96e0 0101f0 00 0 0 4 [31] .debug_str PROGBITS 00000000 4d98d0 01cc33 01 MS 0 0 1 [32] .debug_ranges PROGBITS 00000000 4f6503 003090 00 0 0 1 [33] .shstrtab STRTAB 00000000 4f9593 000147 00 0 0 1 [34] .symtab SYMTAB 00000000 4f9c7c 0208b0 10 35 b85 4 [35] .strtab STRTAB 00000000 51a52c 025b11 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings) I (info), L (link order), G (group), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific) |
.debug_infoというセクションが有ると、デバッグ情報付きです。
とあるapacheはデバッグ情報付きでした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
$ readelf -S /usr/lib/firefox/firefox There are 29 section headers, starting at offset 0x12180: Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 [ 1] .interp PROGBITS 0000000000000270 00000270 000000000000001c 0000000000000000 A 0 0 1 [ 2] .note.ABI-tag NOTE 000000000000028c 0000028c 0000000000000020 0000000000000000 A 0 0 4 [ 3] .note.gnu.build-i NOTE 00000000000002ac 000002ac 0000000000000024 0000000000000000 A 0 0 4 [ 4] .gnu.hash GNU_HASH 00000000000002d0 000002d0 0000000000000174 0000000000000000 A 5 0 8 [ 5] .dynsym DYNSYM 0000000000000448 00000448 0000000000000a20 0000000000000018 A 6 3 8 [ 6] .dynstr STRTAB 0000000000000e68 00000e68 000000000000082e 0000000000000000 A 0 0 1 [ 7] .gnu.version VERSYM 0000000000001696 00001696 00000000000000d8 0000000000000002 A 5 0 2 [ 8] .gnu.version_r VERNEED 0000000000001770 00001770 0000000000000110 0000000000000000 A 6 6 8 [ 9] .rela.dyn RELA 0000000000001880 00001880 00000000000003a8 0000000000000018 A 5 0 8 [10] .rela.plt RELA 0000000000001c28 00001c28 0000000000000570 0000000000000018 A 5 12 8 [11] .init PROGBITS 0000000000002198 00002198 0000000000000018 0000000000000000 AX 0 0 4 [12] .plt PROGBITS 00000000000021b0 000021b0 00000000000003b0 0000000000000010 AX 0 0 16 [13] .text PROGBITS 0000000000002560 00002560 000000000000ad68 0000000000000000 AX 0 0 16 [14] .fini PROGBITS 000000000000d2c8 0000d2c8 000000000000000e 0000000000000000 AX 0 0 4 [15] .rodata PROGBITS 000000000000d2e0 0000d2e0 0000000000000ef4 0000000000000000 A 0 0 16 [16] .eh_frame_hdr PROGBITS 000000000000e1d4 0000e1d4 0000000000000784 0000000000000000 A 0 0 4 [17] .eh_frame PROGBITS 000000000000e958 0000e958 0000000000002504 0000000000000000 A 0 0 8 [18] .tbss NOBITS 0000000000211a20 00011a20 0000000000000009 0000000000000000 WAT 0 0 8 [19] .ctors PROGBITS 0000000000211a20 00011a20 0000000000000010 0000000000000000 WA 0 0 8 [20] .dtors PROGBITS 0000000000211a30 00011a30 0000000000000010 0000000000000000 WA 0 0 8 [21] .jcr PROGBITS 0000000000211a40 00011a40 0000000000000008 0000000000000000 WA 0 0 8 [22] .data.rel.ro PROGBITS 0000000000211a50 00011a50 0000000000000178 0000000000000000 WA 0 0 16 [23] .dynamic DYNAMIC 0000000000211bc8 00011bc8 0000000000000200 0000000000000010 WA 6 0 8 [24] .got PROGBITS 0000000000211dc8 00011dc8 0000000000000238 0000000000000008 WA 0 0 8 [25] .data PROGBITS 0000000000212000 00012000 0000000000000070 0000000000000000 WA 0 0 16 [26] .bss NOBITS 0000000000212070 00012070 00000000000003b8 0000000000000000 WA 0 0 16 [27] .gnu_debuglink PROGBITS 0000000000000000 00012070 000000000000000c 0000000000000000 0 0 1 [28] .shstrtab STRTAB 0000000000000000 0001207c 00000000000000fe 0000000000000000 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), l (large) I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific) |
ubuntu 12.04 amd64にパッケージで入れたfirefoxは.debug_infoというセクションはありません。
.gnu_debuglink があやしい気がしますが詳細は調べてません。
ubuntu12.04で確認
今回は、/dev/sdbにマウントされているUSB HDDを操作したい。
USB IDを調べる
1 2 |
$ udevadm info --query=path --name=/dev/sdb /devices/pci0000:00/0000:00:13.2/usb2/2-2/2-2:1.0/host7/target7:0:0/7:0:0:0/block/sdb |
2-2が重要
最初の2がUSBバスID
後ろの2がデバイスID
らしい
unbind
1 |
# echo -n "2-2" > /sys/bus/usb/drivers/usb/unbind |
bind
1 |
# echo -n "2-2" > /sys/bus/usb/drivers/usb/bind |
nautilusでUSBデバイスを、アンマウントした時
いちいちデバイスの抜き差ししなくても済む。
自宅PCは、TV出力専用である。
テレビの下に置いてあり、キーボード、マウスは繋いでいない。
今までは、ノートPCからsynergyでキーボード、マウスを共有してたのだが、
Nexus7購入と共に、android端末が、PCのコンソールの代わりにならないかと考え
調べてみたところ、何個か選択肢がありそうだ。
結構情報が多いのが、VNCでの接続。
もともと画面の共有が目的のソフトなので、そこまでは不要なので却下。
次に今まで使っていた、synergyのandroid版。
日本語情報は、皆無だがなんとなく却下。
一応理由としては、synergyは操作される側(今回はTV接続PC)が、
操作する側を指定して、ソフトを起動する必要がある。
セキュリティ的には好ましいのだが、既に一つ起動していて複数起動が出来るか疑問だし
Nexus7側のIPは動的だしちょいと面倒。
そこで有力候補は、RemoteDroidとなった。
android側は、RemoteDroidをインストールして、操作するPCの
IPアドレスを指定するだけ。
操作される側は、RemoteDroidのサイトより、アプリをダウンロードして
起動しておくだけ。
自分のPC環境は、ubuntuなのだが、PCのソフトもjavaで作られていて
ubuntuでも問題なく動く。これは非常に嬉しい。
1 |
$ java -jar RemoteDroidServer.jar |
これだけ。うーん簡単。
Windows環境ならバッチファイルが同梱されているのでそれをクリックするだけのはず。
セキュリティを考えると、認証も無いのでちょっと不安だけど
自宅ネットワーク内ならまー気にする必要もないと思う。
rbash
bashを-rオプションで起動するか、bashのシンボリックリンクがrbashになっているか。
多分大抵のディストリビューションでは、rbashのシンボリックリンクが作られていると思う。
結構古いbashからあった機能らしい。確認した一番古いbashでversion 2.05なのでソートー昔からある。
実際に使ってみると、
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ bash -r $ cd Desktop bash: cd: 制限されています $ /bin/ls bash: /bin/ls: 制限されています: `/' をコマンド名の中に指定できません $ PATH="/bin/" bash: PATH: 読み取り専用の変数です $ echo "hoge" > hoge.txt bash: hoge.txt: 制限されています: 出力をリダイレクト出来ません |
なんも出来ねー
一応manページによると、以下が出来無いらしい。
かなり厳しい制限だが、共有レンタルサーバなどでユーザにshellを開放する場合は
使えるかもと思った。
chroot+sshが理想なんだろうけど、opensshにパッチあてたり、必要なコマンドをchroot下に用意したりするより
簡単なのではと思う。
特にパッチあては、パッケージ管理から外れるので、sshなんて重要なものでは極力避けたいし。
最近はディストリビューション標準パッケージで、chroot可なものもあるのだろうか。
追加
1 2 3 4 5 6 7 8 9 |
$ bash -r $ cd Desktop rbash: cd: 制限されています $ bash $ cd Desktop Desktop$ |
あれ?
もっと楽な方法がありました。
シェルスクリプトで、アルファベット一覧を使いたい時がある。
例えば、
「ほげA」
「ほげB」
「ほげC」
なんてディレクトリを作りたい時、数字であればseqを使えばそれで済むのだが
アルファベットだと簡単な方法が分からない。(あるのかもしれないが)
それでたどり着いたのが、以下の方法
1 2 3 4 |
$ for i in `seq 65 90 ` > do > printf "%b\n" $(printf "%s%x" "\\x" $i) > done |
ワンライナーだとこんな感じ
1 |
$ for i in `seq 65 90 `; do printf "%b\n" $(printf "%s%x" "\\x" $i); done |
簡単な説明としては、seqで65から90まで出力します。
これは、asciiコードの10進数で、A〜Zになります。
※詳細は、man asciiで確認
次にprintfで16進数にして、文字の前に\xを付けてあげます。
1 2 |
$ printf "%s%x" "\\x" 65 \x41 |
これを、printfで%bで出力します。
1 2 |
$ printf "%b\n" $(printf "%s%x" "\\x" 65) A |
と、こんな感じです。
小文字にしたい場合は、97から122にしてあげます。
これでシェルスクリプト時に、アルファベット一覧が使えます。
pythonならこんなの感じ?
1 |
$ python -c "import string; print '\n'.join(string.ascii_uppercase)" |