Fork me on GitHub

2009/06/24

はてな
これはgithubじゃなくても使えるかも
Gitはトランスポート層が選択出来るのは知っていたけど、まさかこんな書き方出来るとは思ってなかった。
以前、こんな記事書きましたが
github.comへのSSH接続にはホスト名"ssh.github.com"、ポート"443"に接続する様に設定します。※このssh.github.comが味噌です。

github.comへのSSH接続にはホスト名"ssh.github.com"、ポート"443"に接続する様に設定します。 ※このssh.github.comが味噌です。

http://mattn.kaoriya.net/software/20081029172540.htm
これ以下の1行で出来る事が分かりました。
# git clone ssh://git@ssh.github.com:443/my-name/my-repo.git
ssh.github.comに443ポートでSSHプロトコルを喋るよ!っていう指定になります。これでcloneしたワーキングツリーでは、以前書いた記事の様にpullはpublic clone、pushはowner cloneというやり方ではなくowner cloneといてpullしている為 .ssh/config ファイルを修正したり
# git remote add origin git@github.com:my-name/my-repo.git
する事もなくいきなりpush出来るになります。
こりゃいいわ。

Version Control with Git Version Control with Git
Jon Loeliger
Oreilly & Associates Inc / ¥ 2,220 (2009-06)
 
発送可能時間:在庫あり。

Posted at 10:33 in ソフトウェア
Tagged as: github, ssh
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip

2009/01/06

はてな
WindowsでGitを使う場合、msysGitというMSYS(Minimal SYStem)ポーティングされたGitを使うのですが、これにはssh-askpassが付いてきません。以前書いた「Big Sky :: Windowsでもssh-agentとssh-addを使ってパスフレーズ入力を省略する。」でご紹介した方法は、開いたコマンドプロンプト内でしか有効になりません。これは新しく起動したコマンドプロンプトに、ssh-agentから引き渡されるSSH_AGENT_PID/SSH_AUTH_SOCKといった環境変数が引き継がれていないのが原因です。これを解決する方法のひとつとして、win-ssh-askpassという物があります。
win-ssh-askpass 1.05 (GANAware)

GUI ssh-agent for cygwin.

http://www.ganaware.jp/archives/2006/04/winsshaskpass_1.html
win-ssh-askpass バージョンアップについてあれこれ (GANAware)

ずいぶん久しぶりに win-ssh-askpass をバージョンアップしました。

http://www.ganaware.jp/archives/2006/04/winsshaskpass_2.html
このwin-ssh-askpassは、ssh-agent起動時に得た環境変数情報をWindowsのユーザ環境変数に登録してくれ、次回起動するコマンドプロンプトでもパスフレーズを聞かれなくするという物です。UNIXだとx11-ssh-askpassとか、ssh-askpass-gnomeというGUIバージョンも存在しますが、これのWindows版という所ですね。
但し、win-ssh-agentはcygwinを使っており、cygwin配下でunix domain socketを使った通信を行っています。unix domain socketを使わず実装されているmsysGitでは動かないのです。他に、puttyのpagent/plinkを使った方法もありますが私が使いたい条件
  • OpenSSH for windows
  • msysGit付属のbashではなく、コマンドプロンプト
  • cygwinは使いたくない
には適応出来なかったりします。
という事で、win-ssh-askpass-1.05のcygwin依存を無くすパッチを書いてみました。
気を付ける所は
  • setenv/putenvの置き換え
  • fork/execからsystemへ
だけです。
以下パッチ
diff -u win-ssh-askpass-1.05.orig/agent.cpp win-ssh-askpass-1.05/agent.cpp
--- win-ssh-askpass-1.05.orig/agent.cpp 2006-04-02 10:42:24.000000000 +0900
+++ win-ssh-askpass-1.05/agent.cpp  2009-01-06 17:21:35.953125000 +0900
@@ -2,8 +2,10 @@
 #include <stdlib.h>
 #include <string.h>
 #include <string>
+#ifdef __CYGWIN__
 #include <sys/cygwin.h>
 #include <sys/wait.h>
+#endif
 #include <unistd.h>
 #include <list>
 #include <stdarg.h>
@@ -56,6 +58,7 @@
 // run ssh-add
 int run_ssh_add(const char *i_identityFile)
 {
+#ifdef __CYGWIN__
   pid_t childPID = fork();
   setenv("SSH_ASKPASS", getAskpassPath().c_str(), 1);
   verbose("export SSH_ASKPASS=%s\n", getAskpassPath().c_str());
@@ -95,6 +98,25 @@
       else
    return -1;
   }
+#else
+  std::string str;
+
+  str = "SSH_ASKPASS=";
+  str += getAskpassPath().c_str();
+  putenv(str.c_str());
+  verbose("export SSH_ASKPASS=%s\n", getAskpassPath().c_str());
+
+  str = "DISPLAY=localhost:0";
+  putenv(str.c_str());
+  verbose("exec ssh-add %s\n", i_identityFile ? i_identityFile : "");
+  if (i_identityFile && !i_identityFile[0])
+    i_identityFile = NULL;
+  str = "ssh-add ";
+  if (i_identityFile) str += i_identityFile;
+  str += " < NUL 2> NUL";
+  verbose(str.c_str());
+  system(str.c_str());
+#endif
 }
 
 // http://sourceware.org/ml/cygwin/2006-02/msg00289.html
@@ -118,6 +140,7 @@
       /* Convert POSIX to Win32 where necessary */
       if (!strcmp(var, "PATH") ||
      !strcmp(var, "LD_LIBRARY_PATH")) {
+#ifdef __CYGWIN__
    winpathlist = (char *)
      malloc(cygwin_posix_to_win32_path_list_buf_size(val) + 1);
    if (winpathlist) {
@@ -125,12 +148,19 @@
      SetEnvironmentVariable(var, winpathlist);
      free(winpathlist);
    }
+#else
+   SetEnvironmentVariable(var, val);
+#endif
       } else if (!strcmp(var, "HOME") ||
         !strcmp(var, "TMPDIR") ||
         !strcmp(var, "TMP") ||
         !strcmp(var, "TEMP")) {
+#ifdef __CYGWIN__
    cygwin_conv_to_win32_path(val, winpath);
    SetEnvironmentVariable(var, winpath);
+#else
+   SetEnvironmentVariable(val, winpath);
+#endif
       } else {
    SetEnvironmentVariable(var, val);
       }
@@ -144,7 +174,11 @@
 void run_program(char **i_argv)
 {
   char win32_pathname[1024];
+#ifdef __CYGWIN__
   cygwin_conv_to_win32_path(i_argv[0], win32_pathname);
+#else
+  strcpy(win32_pathname, i_argv[0]);
+#endif
   setup_win_environ();
  
   if (i_argv[1])
@@ -386,7 +420,7 @@
           NULL, NULL, g_hInst, this);
    
     // show tasktray icon
-    std::memset(&m_ni, 0, sizeof(m_ni));
+    memset(&m_ni, 0, sizeof(m_ni));
     m_ni.cbSize = sizeof(m_ni);
     m_ni.uID    = ID_TaskTrayIcon;
     m_ni.hWnd   = m_hwndTaskTray;
@@ -513,7 +547,13 @@
       verbose("DISPLAY=%s\n", getenv("DISPLAY"));
    
     std::string askpassPath(getAskpassPath());
+#ifdef __CYGWIN__
     setenv("SSH_ASKPASS", askpassPath.c_str(), 1);
+#else
+    std::string str("SSH_ASKPASS=");
+    str += askpassPath;
+    putenv(str.c_str());
+#endif
     writeRegistry(HKEY_CURRENT_USER, "Environment", "SSH_AGENT_PID",
          getenv("SSH_AGENT_PID"));
     verbose("export SSH_AGENT_PID=%s\n", getenv("SSH_AGENT_PID"));
diff -u win-ssh-askpass-1.05.orig/misc.cpp win-ssh-askpass-1.05/misc.cpp
--- win-ssh-askpass-1.05.orig/misc.cpp  2002-09-23 03:32:39.000000000 +0900
+++ win-ssh-askpass-1.05/misc.cpp   2009-01-06 17:18:43.656250000 +0900
@@ -1,5 +1,7 @@
 #include "misc.h"
+#ifdef __CYGWIN__
 #include <sys/cygwin.h>
+#endif
 
 // instance
 HINSTANCE g_hInst = NULL;
@@ -74,9 +76,16 @@
 // get the path of win-ssh-askpass.exe
 std::string getSelfPath()
 {
+#ifdef __CYGWIN__
   char win32_pathname[1024];
   GetModuleFileName(NULL, win32_pathname, NUMBER_OF(win32_pathname));
   char posix_pathname[1024];
   cygwin_conv_to_posix_path(win32_pathname, posix_pathname);
   return posix_pathname;
+#else
+  char win32_pathname[1024], *ptr = win32_pathname;
+  GetModuleFileName(NULL, win32_pathname, NUMBER_OF(win32_pathname));
+  while (*ptr++) if (*ptr == '\\') *ptr = '/';
+  return win32_pathname;
+#endif
 }
これを適応すると、mingw32だけでビルド出来る様になります(mingw32-make)。なお、cygwinでビルドすればこれまで通りのモジュールが出来上がります。
ビルド出来たら、win-ssh-agentを起動します。すると
win-ssh-askpass
の様に入力ダイアログが表示されます。ここにパスフレーズを入力すれば、後は次回から起動するコマンドプロンプトで
win-ssh-askpass-console
と環境変数が引き継がれる事になります。
Big Sky :: Windowsでもssh-agentとssh-addを使ってパスフレーズ入力を省略する。」で書いた、setxがあればwin-ssh-agentを使わなくても美味く行くのですが、コマンドプロンプトが出ないので少しカッコよくなりました。
これをWindowsのスタートアップに入れておけば初回にパスフレーズを入力した後は、sshパスフレーズを聞かれる事無くsshが行える様になります。

win-ssh-agent++

よろしければどうぞ。
というか私くらいしか、必要ないか...
Posted at 18:14 in ソフトウェア
Tagged as: ssh, windows
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip

2008/11/06

はてな
UN*X版だとssh-agentの実行結果が
SSH_AUTH_SOCK=/tmp/ssh-suhGif2116/agent.2116; export SSH_AUTH_SOCK;
SSH_AGENT_PID=5672; export SSH_AGENT_PID;
echo Agent pid 5672;
みたいになっててログイン時に
eval `ssh-agent`
とするんですがWindowsだと、そう簡単には行かない。
@echo off
if not "%SSH_AGENT_PID%" == "" goto end
for /f "eol=; tokens=1,2 delims==;" %%1 in ('ssh-agent.exe') do (
 if "%%1" == "SSH_AUTH_SOCK" set SSH_AUTH_SOCK=%%2
 if "%%1" == "SSH_AGENT_PID" set SSH_AGENT_PID=%%2
)
ssh-add
:end
開発を始める前にコマンドプロンプトで1回これを動かすとパスフレーズを聞かれ、1回入力すれば以降は聞かれない様になる(sshはmsysGitに含まれる物を使ってる)。 さらにWindowsサポートツールに入ってる"setx.exe"を使えば、ユーザ環境変数への反映も出来る為、新しく起動したコマンドプロンプトでsshコマンドがSSH_AGENT_PID/SSH_AUTH_SOCKを見てくれるようになってもっとウマーとなるはず(↑のバッチでsetしている所でさらにsetxもする必要があるかな)。

とりあえずこれで楽になった。ウマー
Posted at 19:39 in ソフトウェア
Tagged as: git, ssh, windows
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip

2008/10/29

はてな
皆さん既に知ってたら御免なさい。ずっと知らなかったのでgithubには手を付けてませんでした。
githubは、cloneするとき
# git clone git://github.com/yappo/konnitiwa.git
の代わりに
# git clone http://github.com/yappo/konnitiwa.git
とgitをhttpにするとclone出来るのは知っていたのですが、pushはsshを使うのでport 22が開いてないとpush出来ない物と信じ込んでいました。
が、今日解決しました。以下私がWindowsで行った手順
Windowsじゃない人は最初の部分はすっ飛ばして下さい。

Git for Windowsを入れる

まずmsys Gitというのを入れます。
msysgit - Google Code
http://code.google.com/p/msysgit/downloads/list
注意点としては、PATH環境変数の設定具合によってはmsys Gitに含まれるコマンドライン郡の方が先に認識され、思う動きにならない可能性があります。例えば私の場合svn/trunkなvimを使っていますがmsys Gitにもvimが含まれている為、commit時にエラーが出たりします。

SSHキーを生成する

msys Gitに含まれるssh-keygenで生成します。
# ssh-keygen -C "xxx@example.com" -t rsa
以下省略

SSHキーをgithubに登録する

アカウントページにid_rsa.pubの値を貼り付けます。
https://github.com/account

github-ssh-pubkey
Titleは適当に"my windows abazure"と名付けました。

github.comへのssh接続を変更する

github.comへのSSH接続にはホスト名"ssh.github.com"、ポート"443"に接続する様に設定します。
※このssh.github.comが味噌です。
~/.ssh/config
Host github.com
    User git
    Hostname ssh.github.com
    Port 443
    IdentityFile c:/docume~1/mattn/.ssh/id_rsa
秘密鍵のパスをお間違え無く。

後はpushしまくれ

本当にpushしまくるのは良くないでしょうが...
yappo's konnitiwa at master — GitHub
こんにちわ
http://github.com/yappo/konnitiwa/tree/master
をforkし
# git clone git@github.com:mattn/konnitiwa.git
Enter passphrase for key 'c:/docume~1/mattn/.ssh/id_rsa':
remote: Counting objects: 9, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 9 (delta 0), reused 6 (delta 0)
Receiving objects: 100% (9/9), done.
とclone出来ますのでREADMEを編集後に
# git commit -a -m "added oops"
Created commit 109bbff: added oops
 1 files changed, 1 insertions(+), 0 deletions(-)
# git push Enter passphrase for key 'c:/docume~1/mattn/.ssh/id_rsa':
Counting objects: 5, done.
Writing objects: 100% (3/3), 264 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:mattn/konnitiwa.git
   66a8481..109bbff  master -> master
でpush出来ます。port 443なので防火壁内の人でもpush出来るかと思います。既にみんな知ってる話だと恥ずかしいですが...

それと昨日書いたニコニコ動画ダウンロードプログラムをgithubで作っていく事にしました。
mattn's nicodown at master — GitHub
http://github.com/mattn/nicodown/tree/master
codereposでも良かったのですが、なんなくgithubを使ってみたくなったので...

よいgithubライフを。

集合知プログラミング 集合知プログラミング
Toby Segaran
オライリージャパン / ¥ 3,570 (2008-07-25)
 
発送可能時間:在庫あり。

Posted at 18:06 in ソフトウェア
Tagged as: git, github, ssh
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip