readelfなんて使ったことないし、バイナリに弱すぎ

C言語を挫折した人間なので、バイナリとかアセンブラとかは全く分からない。

スクリプト言語サイコーなのだが、どうしたってサーバを動かしていれば

C言語で書かれた、デーモンやら何やらでトラブルは起きる。

先日もデーモンプログラムで、どうも変な挙動をしていたのだが

古いプログラムで、しかもソースから入れていることもあって

なんとか自力で原因究明しなくてはならなくなった。

元々、デバッグ情報付きでコンパイルされてなく

オプションを付けてコンパイルしなくてはならなかったのだが

付けたはずのオプションが、どっかで無効になったのか

gdbで実行すると、デバッグ情報が無いよ! と怒られまくった。

デバッグ情報が付かなかったのは、Makefile内の修正箇所ミスだったのだが

都度gdbを実行してから怒られており、もっと簡単に知る方法はないのかと調査した。

  • 結果

だそうです。

  • 試しにやってみた

.debug_infoというセクションが有ると、デバッグ情報付きです。

とあるapacheはデバッグ情報付きでした。

ubuntu 12.04 amd64にパッケージで入れたfirefoxは.debug_infoというセクションはありません。

.gnu_debuglink があやしい気がしますが詳細は調べてません。

コマンドでusbデバイスを操作

ubuntu12.04で確認

今回は、/dev/sdbにマウントされているUSB HDDを操作したい。

USB IDを調べる

 

 

 

2-2が重要

最初の2がUSBバスID
後ろの2がデバイスID
らしい

unbind

 

 

bind

 

 

 

nautilusでUSBデバイスを、アンマウントした時
いちいちデバイスの抜き差ししなくても済む。

debianパッケージをサイズ順に並べる方法

小さいシステムが好きな人間としては、どのパッケージがどのくらいディスク容量を消費しているか知りたくなる。

debian系のパッケージ管理なら以下のコマンドで一発

mysql関連が結構使ってますね。

androidでPCを操作(RemoteDroid)

自宅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でも問題なく動く。これは非常に嬉しい。

これだけ。うーん簡単。

Windows環境ならバッチファイルが同梱されているのでそれをクリックするだけのはず。

セキュリティを考えると、認証も無いのでちょっと不安だけど

自宅ネットワーク内ならまー気にする必要もないと思う。

多分自分のシェルがこれになったら泣きたくなる(rbash)

rbash

bashを-rオプションで起動するか、bashのシンボリックリンクがrbashになっているか。

多分大抵のディストリビューションでは、rbashのシンボリックリンクが作られていると思う。

結構古いbashからあった機能らしい。確認した一番古いbashでversion 2.05なのでソートー昔からある。

実際に使ってみると、

 

なんも出来ねー

一応manページによると、以下が出来無いらしい。

  • cd を使ってディレクトリを変更すること
  • SHELL, PATH, ENV, BASH_ENV の値の設定や設定取り消しを行なうこと
  • / を含むコマンド名を指定するこ
  • 組み込みコマンド .  の引き数として / を含むファイル名を指定すること
  • 組み込みコマンド hash に対するオプション -p の引数として / を含むファイル名を指定すること
  • 起動時にシェル環境から関数定義をインポートすること
  • 起動時にシェル環境から SHELLOPTS の値を展開すること
  • リダイレクション演算子 >, >|, <>, >&, &>, >> を使ってリダイレクトを行 なうこと
  • 組み込みコマンド exec を用いて、シェルを別のコマンドに置き換えること
  • 組み込みコマンド enable に対する -f オプションと -d オプションを使って、組み込みコマンドを追加・削除すること
  • 組み込みコマンド command に -p オプションを指定すること
  • set +r や set +o restricted を用いて制限モードを解除すること

かなり厳しい制限だが、共有レンタルサーバなどでユーザにshellを開放する場合は

使えるかもと思った。

chroot+sshが理想なんだろうけど、opensshにパッチあてたり、必要なコマンドをchroot下に用意したりするより

簡単なのではと思う。

特にパッチあては、パッケージ管理から外れるので、sshなんて重要なものでは極力避けたいし。

最近はディストリビューション標準パッケージで、chroot可なものもあるのだろうか。

追加

あれ?

シェルスクリプトで、アルファベット一覧を使いたい時

もっと楽な方法がありました。

シェルスクリプトで、アルファベット一覧を使いたい時がある。

例えば、

「ほげA」

「ほげB」

「ほげC」

なんてディレクトリを作りたい時、数字であればseqを使えばそれで済むのだが

アルファベットだと簡単な方法が分からない。(あるのかもしれないが)

それでたどり着いたのが、以下の方法

 

 

 

ワンライナーだとこんな感じ

 

 

簡単な説明としては、seqで65から90まで出力します。
これは、asciiコードの10進数で、A〜Zになります。

※詳細は、man asciiで確認

次にprintfで16進数にして、文字の前に\xを付けてあげます。

 

これを、printfで%bで出力します。

 

 

と、こんな感じです。

小文字にしたい場合は、97から122にしてあげます。

これでシェルスクリプト時に、アルファベット一覧が使えます。

pythonならこんなの感じ?