nDiki : シェル

2012年3月8日 (木)

特定の Git リポジトリだけ読み書きできる SSH 鍵を作る

サーバ上の特定の Git リポジトリのみにアクセスできる SSH 鍵を作ってみた。

具体的にいうと、SSH 鍵を作って、さくらのレンタルサーバ上に dotfiles 用 Git リポジトリを作ってそこだけを読み書きできるように設定した。今回は Gitosis とかそういう大袈裟なのは使わないない方向で。

サーバ上に Git リポジトリを作る

まずサーバに SSH で入ってホームディレクトリの下に Git リポジトリを作成。

 $mkdir -p /home/naney/var/git/dotfiles.git
 $cd /home/naney/var/git/dotfiles.git
 $git --bare init

特定の Git リポジトリだけにアクセスできる git-shell ラッパーを用意する

通常の git-ssh は特定のリポジトリだけアクセスを許可するとかできない。 なのでさきほど作った Git リポジトリのみアクセスできるようなラッパーを用意する。

 #!/bin/sh

 repo=$(eval echo $(echo ${SSH_ORIGINAL_COMMAND} | cut -d' ' -f2))
 if [ "x${repo}" != "x/home/naney/var/git/dotfiles.git" ]; then
   echo "No access granted to reporitory ${repo}" 1>&2
   exit 1
 fi

 /home/naney/local/git/bin/git-shell -c "${SSH_ORIGINAL_COMMAND}"

これをサーバ上で /home/naney/local/bin/git-shell-dotfiles という名前で保存し実行権限をセットしておく。 なお Git は ~/local/git の下に以前インストールしておいてある。

複数のディレクトリを指定できるようにするとか、そういのはよしなにどうぞ。

ローカルホスト上で専用の SSH 鍵を作ってサーバに送る

 $cd ~/.ssh
 $ssh-keygen -C dotfiles -f id_rsa.dotfiles
 $ssh-copy-id -i ~/.ssh/id_rsa.dotfiles naney@example.sakura.ne.jp

サーバ上の authorized_keys を修正する

さきほどの ssh-copy-id で、サーバ上の ~/.ssh/authorized_keys の最後に新しい鍵の行が追加されている。この行の先頭に以下を追記する。

command="/home/naney/local/bin/git-shell-dotfiles",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty

これでこの鍵で接続した時は git-shell-dotfiles のみが直接実行できるようになる。

なおシェルをフルには使わせてくないけれど、任意のディレクトリの Git リポジトリの読み書きができても良いのであれば直接 git-shell を指定する。

command="/home/naney/local/git/git-shell -c \"$SSH_ORIGIAN_COMMAND\"",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty

ローカルホスト上の ~/.ssh/config を編集

config ファイルに

 IdentityFile ~/.ssh/id_rsa.dotfiles

を追記し、この鍵も使えるようにしておく。

clone してみる

きちんとできていれば

 git clone naney@example.sakura.ne.jp:/home/naney/var/git/dotfiles.git

とすることで clone できることを確認。またサーバ上の他の場所に作ったリモートリポジトリにアクセスができないようになっていることをチェック。(テストする時は他の SSH 鍵で接続されないように .ssh から他の鍵を削除する)。

別の端末で

~/.ssh/id_rsa.dotfiles を適宜別の端末にコピーし、~/.ssh/config に IdentityFile を書き込めば、同様に git clone できるようになる。

スポンサード リンク
[ 3月8日全て ]

2012年8月17日 (金)

レビュー】iBUFFALO Xperia GX SO-04D専用 3Hハードケース 液晶保護フィルム付 BSMPSO04DH

iBUFFALO Xperia GX SO-04D専用 3Hハードケース 液晶保護フィルム付

Xperia GX と同時に購入。

レッドもいいなと思ったんだけれど、塗りが剥げた時のことを考えてピアノブラックをチョイス。

ボタンのところは穴ではなくて側面から切り欠きにしてあるので操作しやすい(Xperia SO-01B で使っていたエレコムシェルカバーは穴にしているタイプなんだけれど、カメラボタンが押しにくかった)。

装着して気がついたんだけれど、側面の端が8箇所ぐらい白くなっている。なんかこう力がかかって変形した時に出るような変色の感じ。 レビューでもきつくてまた割れやすいと評されているので結構弱いのかもしれない。

電池パック交換でしょっちゅう付けたり外したりしているといっちゃうかもしれない。


[ 製品レポート ]

[ 8月17日全て ]

2012年9月23日 (日)

今日のさえずり: もう少し以前みたいにダラダラ Tweet してもいいと思った

2012年09月22日

  • 09:32 ジュエルぺー。
  • 10:09 Xperia GXiPad 2 の間でクリップボード共有したいんだけれど、セキュアなソリューションでいいのないかな。
  • 11:39 Chrome to Phone 入れた。
  • 25:29 昼遊んで過ごして21:00ぐらいから寝落ちして、はっと起きて「週末オワタ」と思ったけど実はまだ土曜日で、まだまだいけると。

2012年09月23日

[ 9月23日全て ]

2013年6月16日 (日)

Twitter API v1.1 対応とか、パイプでやりとりするの JSON でいいのとか

Twitter API v1.1 に対応していないスクリプトがあって、たしか OAuth 対応はしてあるけど RSS 形式を使っていたので JSON で取得して処理するようにしなければなーと思ってたんだけれど、そもそも OAuth 対応すらしてなかった。

なので Net::Twitter::Lite を使うように書き換え。

あと、いままで1つのスクリプトで「Twitter API を呼び出してタイムライン取得」「シリアライズしてファイルに保存」「Wiki 形式に整形して書き出し」をしていたんだけれど、UNIX 哲学に従って小スクリプトに分割してパイプで受け渡すように変更するなど。

スクリプト間のやりとりは構造化テキストデータなので JSON にしたんだけれど、若干これでいいのかなぁ感はある。テキスト形式だし最近の主流フォーマットではあるんだけれど、それでもシェルから見ると複雑な形式な気がするんだよね。でもあと軽量な構造化テキストフォーマットだと YAML ぐらいかなぁ。

[ 6月16日全て ]

2013年10月29日 (火)

今日のさえずり: 弊害は知りつつもいわゆる半角スペースいれないと気持ち悪く感じる体になってしまっている

2013年10月29日

  • 09:55 「オーケー。どんな仕事でも場合によっては退屈になるなら、逆にどんな仕事でも情熱をもっていきいきとやることもできる。そうだね?」 -- フィッシュ! p.36
  • 13:12 雨なので。 (@ セブンイレブン 渋谷区渋谷2の南店) http://4sq.com/1g8p7KK
  • 13:57 今年はクリスマスツリー新調したいな。去年11月下旬に店頭・ネットチェックしたら既に出遅れだったので、そろそろ動くか。
  • 19:28 GitHub / GitHub Enterprise で side-by-side diff。 / “Chrome Web Store - Octosplit” http://bit.ly/HsDHxp
  • 19:28 “nifty:デイリーポータルZ:鮫洲運転免許試験場は食べログ2.95点” http://bit.ly/1aDM702
  • 19:58東京都交通安全協会 ピーポくんグッズ” http://bit.ly/1iqV8KH
  • 19:58 「犯罪を見逃さない!」 (個人使用はできません) / “大東京防犯ネットワーク|地域の防犯|地域に密着したクルマによる防犯パトロール その2「動く防犯の眼」” http://bit.ly/1iqV8KG
  • 20:33 理科作。弊害は知りつつもいわゆる半角スペースいれないと気持ち悪く感じる体になってしまっている。 / “出版社に送る原稿には日本語と英単語の間にスペースを入れない方が良いらしいので贖罪のためにシェル芸やります。 | 上田さんのブログ” http://bit.ly/1hpCchR
  • 20:47 雨。 (@ 株式会社ミクシィ (mixi, Inc.)) http://4sq.com/1comKmb
[ 10月29日全て ]

2013年11月20日 (水)

Shibuya Plack/PSGI Conference (shibuya.pl) #1 #plackcon

LINE株式会社で開催された Shibuya Plack/PSGI Conference (shibuya.pl) #1 #plackcon 「秋のPlack/PSGI祭り」に参加してきた。今回は YAPC::Asia Tokyo でもよくトークされている masartz 氏とご一緒させていただいた。ここの会場にくるのは「第3.5回 データ構造と情報検索と言語処理勉強会」「PerlCasual #05」に続き3回目。

開催を知った時には定員60人すでに埋まっていて補欠だったんだけれど、その後定員80人に増やしてくれたようで参加できるようになった。当日時点ではキャンセル等で定員切っていてきたい人はこれるようになってたよ。

普通に使う Plack/PSGI Server @fujiwara 氏

会場アンケートをとりつつ、必須な/便利なモジュールや Plack::Middleware の紹介。

  • だいたい Starlet か Sterman を使っている。
  • リバースプロキシ使っている時には Plack::Middleware::ReverseProxy が便利。
  • Server::Starter の start_server では plackup を実行するシェルスクリプトを作ってそれを指定するようにするとパラメータ変更できるのでいいよ。
  • Devel::NYTProf する時には if $$ % 11 == 0 などで一部のプロセスだけでプロファイリングするようにすると不運な人は遅くなるけど、全体の影響抑えつつできるよ。

『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3 を受けての話題 @kazeburo 氏

YAPC::Asia Tokyo 2013 の発表の続き。

Plack/PSGI のパフォーマンス向上の取り組みが進めば Perl の適用領域を広がるし(リアルタイムな広告系とか)、Perl 使いの仕事も増えるよ。

Plack::BodyParser の話 @tokuhirom 氏

  • 最近のサーバーサイドの開発JSON API開発と管理画面の開発だよね。
  • HTTP ステータスコードの使い方をシンプルに。アクセス自体が成功したら 200 を返して、API の結果の方に API 処理自体のステータスを入れる方がシンプルだし、アクセスログ処理なども楽だよと。
  • JSON API のボディ内で返すステータスも HTTP ステータスコードと同じにしたら覚えることが少なくて楽。
  • URI の /v1/ とか入れたりするけど /v2/ とか出たためしがない。

など。プラクティカルなトーク。

Plack::Request with Encoding @moznion 氏

リクエスト中のパラメータの decode を Plack で一箇所でやってしまう話。

Mojolicious の知りたい 10 のコト @yusukebe 氏

  • morbo と hypnotoad。それほどパフォーマンス悪くない。
  • Mojo::Base は使わなくていい。それほど機能無いし、Web 系以外では Mojo に依存したくないし。

YAPC::Asia 2014 やります!」とのことです。

LT

@bayashi 氏の plackup -e でちょっとしたこといろいろできて便利だよという話や、@azumakuniyuki 氏の Haineko の話や、 @hkoba 氏のコントローラを書く人がいないプロジェクト向けのテンプレートエンジンの話や、@songmu 氏の .psgi からの卒業の話とか、@tasukuchan 氏のきまぐれオレンジ☆ロードについてのラジオみたいなビデオ LT とか。

空気を読まない(読めない)一方通行なビデオ LT は新しく。

[ 11月20日全て ]

2014年1月29日 (水)

git-new-workdir で複数の Git ブランチをチェックアウトして同時に作業する

Git のトピックブランチ開発している時に、他のブランチを同時にチェックアウトしておきたくなる事がままある。

  1. 割り込みで他の人のコードをレビューするため。
  2. 途中で別の不具合見つけたので、別トピックブランチで先に fix するため。
  3. 複数のブランチ上のファイルをつまみ食い的に Emacs で開いて中を見たりしたいため。
  4. 他の人に使い勝手などを確認してもらうため、あるブランチWeb サーバを起動したいため。

いったんテンポラリコミットを作ったり、あるいは stash したりして作業ツリーを保存してチェックアウトしなおして用事を済ませて元に戻すとかはやるのだけれど、ちょっと面倒。3番目のケースは同時にチェックアウトしたいのでこの方法だと駄目だし、4番目のケースだとしばらくそのままにしておかないのでもっと困る。

そのような時はローカルリポジトリから別ディレクトリへ clone して、そちらをサブで使ったりするんだけれど、サブの方でちょっと修正したりした際にローカル間で push/pull とかしなければならなくてこれまた面倒。

なんかいいのないかなと思ったら Git の contrib に git-new-workdir というのがあるのを昨日知った。

 git-new-workdir . ../sub
 あるいは
 git new-workdir . ../sub

で作業ツリーを新しく作れる。/tmp/git/main を /tmp/git/sub に new-workdir すると sub の方の .git の中は

 drwxr-xr-x 3 naney naney 4096  1月 30 00:37 .
 drwxr-xr-x 3 naney naney 4096  1月 30 00:37 ..
 -rw-r--r-- 1 naney naney   23  1月 30 00:37 HEAD
 lrwxrwxrwx 1 naney naney   25  1月 30 00:37 config -> /tmp/git/main/.git/config
 lrwxrwxrwx 1 naney naney   24  1月 30 00:37 hooks -> /tmp/git/main/.git/hooks
 -rw-r--r-- 1 naney naney  104  1月 30 00:37 index
 lrwxrwxrwx 1 naney naney   23  1月 30 00:37 info -> /tmp/git/main/.git/info
 drwxr-xr-x 2 naney naney 4096  1月 30 00:37 logs
 lrwxrwxrwx 1 naney naney   26  1月 30 00:37 objects -> /tmp/git/main/.git/objects
 lrwxrwxrwx 1 naney naney   30  1月 30 00:37 packed-refs -> /tmp/git/main/.git/packed-refs
 lrwxrwxrwx 1 naney naney   23  1月 30 00:37 refs -> /tmp/git/main/.git/refs
 lrwxrwxrwx 1 naney naney   26  1月 30 00:37 remotes -> /tmp/git/main/.git/remotes
 lrwxrwxrwx 1 naney naney   27  1月 30 00:37 rr-cache -> /tmp/git/main/.git/rr-cache
 lrwxrwxrwx 1 naney naney   22  1月 30 00:37 svn -> /tmp/git/main/.git/svn

のような感じで HEAD と index と logs/HEAD 以外はもとのローカルリポジトリへのシンボリックになっている。なので sub での checkout や index の Git 操作など以外は main の方へ反映されるようになっている。わざわざ push/pull しなくて良いのでこれは楽ちん。もちろん作業ツリーはそれぞれ独立しているので、例えばサブの方で Web サーバを起動しておいたり時間のかかるフルテストを走らせておくとかもできる。

ただ複数チェックアウトして作業していると、気がつくと Emacs で違うほうの作業ツリーのファイルを開いて編集していたりして「あれ? 変更したけれどなぜか反映されない……」とかやっちゃうので(実際やった)ちょっと注意が必要ではある。

git-new-workdir は contrib の中(Debian GNU/Linux sid だと /usr/share/doc/git/contrib/workdir/git-new-workdir)にあるみじかいシェルスクリプトなので適当に PATH の通ったところにコピーして実行権限を設定しておけば OK。

Git はこういうところがカワイイよね。

[ 1月29日全て ]

2014年2月19日 (水)

今日のさえずり: 風呂入って出てきたら、シェル上では perlbrew で別の Perl が動いているのを思い出したとか

2014年02月19日

  • 08:41 “ベル研究所が開発するOS「Plan 9」が新たにGPLv2で公開される | SourceForge.JP Magazine” http://bit.ly/1jPdzy3
  • 09:24 iddy 終了。リンクとか外さないと。 / “【重要なお知らせ】iddyサービス終了のお知らせ | iddy 開発者ブログ” http://bit.ly/1feX5Mf
  • 09:24 7,000円台ぐらいまでで出たら即買ってもいいな。iPad 2 での FaceTime のかわりになる。もし国内で出る事があればもっと高くなるんだろうなぁ。 / “数千円で買えて携帯会社と契約不要の「Skypeスマートフォン...” http://bit.ly/1feX7Uk
  • 09:24 「運営者が飽きた」 / “iddy 終了について補足 | WWW WATCH” http://bit.ly/1m7oLnX
  • 10:35 歌うキーボード ポケット・ミク (大人の科学マガジン特別編集)とな。 http://amzn.to/1bjmkNH
  • 21:25 今作っている機能、テーブル1つで済ませるつもりだったけれど、ゴチャゴチャしてきたのでやっぱり明日分ける。
  • 22:53 “大雨・大用に日本野鳥の会バードウォッチング長靴” http://bit.ly/1cpOp4s
  • 24:29 さてこの Subversion で管理しているコードを Git 管理にするかなととりあえず svn log したら「作業コピーではありません」と出て、あれっと思ってみたら CVS/ というディレクトリが。
  • 24:33 そしてなんでこれ /var/www 以下できちんと動いているのに手動で動かすとモジュール見つからないのって思って風呂入って出てきたら、シェル上では perlbrew で別の Perl が動いているのを思い出したとか。
  • 25:03 “文字列検索コマンド「grep 2.17」リリース | SourceForge.JP Magazine” http://bit.ly/1gVu5sN
  • 25:03 “CSRF対策用トークンの値にセッションIDそのものを使ってもいい時代なんて、そもそも無かった” http://bit.ly/1kXbPTN
[ 2月19日全て ]

2014年4月4日 (金)

tmux でペインでの作業をロギングしておく設定

ターミナルでの作業の内容をファイルに書き出しておきたいことがある。特に SSH で入ったリモートホスト上での作業内容を手間をかけずにローカルホスト上にもってきたいことがよくある。

tmux だと pipe-pane コマンドを使うと各ペインでの作業をパイプでコマンドに送っておけると教えてもらったので設定してみた。

パイプからの送り先のコマンドを用意する

cat でもいいのだけれど自分は日付別に保存したいので以下のようなシェルスクリプトを ~/.dotfiles/bin/log-tmux として作る。

 #!/bin/sh

 DATE=`date "+%Y-%m-%d"`
 LOG_DIR=$HOME/var/tmux/log/$DATE
 LOG_FILE=$LOG_DIR/tmux-$DATE-$1.log
 mkdir -p $LOG_DIR
 tmux display-message "Started logging to $LOG_FILE"
 cat >> $LOG_FILE

~/.tmux.conf にキーバインディングを設定する

~/.tmux.conf に以下を追加。

 #
 # logging
 #
 # C-t C-p (toggle)
 bind-key C-p pipe-pane -o '$HOME/.dotfiles/bin/log-tmux "#S-#I:#W-#P"'

これで prefix*1 + C-p をタイプすると

 ~/var/tmux/log/2014-04-04/tmux-2014-04-0-0:bash-0.log

みたいな感じでファイルが作られてそこに pane に出力された内容が書き出されはじめる。もういちど prefix + C-p すると停止。複数のペインで同時に別のファイルにロギングしておける(それぞれで prefix + C-p をタイプして開始させておく)。

ちなみに #S とかは以下。

  • #S: セッション名
  • #I: 現在のウインドウインデックス
  • #W: 現在のウインドウ名
  • #P: 現在のペインインデックス

保存されたファイルにはエスケープシーケンスなども含まれるので見る時は less -R や lv -c あたりを使うとみやすい。

*1自分は C-t

[ 4月4日全て ]

2014年6月18日 (水)

tmux から PuTTY のタイトルバーのタイトルを設定する

PuTTY のタイトルバーの設定をする方法としてシェル上で printf 使うとかあるけれど tmux 起動していると反映されない。

と思ったら .tmux.conf で

  set-option -g set-titles on

しておくだけでよかった。

これで複数 PuTTY を開いている時に Windows のタスクバー上でセッション名で区別できるようになって楽になった。

[ 6月18日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

※内容は個人的見解であり所属組織とは関係ありません。

follow us in feedly

月別インデックス
Process Time: 0.069734s / load averages: 0.70, 0.99, 0.77
nDiki by WATANABE Yoshimasa (Naney, Google profile)
Powered by DiKicker