2017-09-27 3 views
2

私はGoでgit cloneと同等の機能を実行しようとしていますが、stdinからの入力を求められたらコマンドを終了したい(例:sshキーがリモートリポジトリに設定されていない場合の認証)。これを行う方法はありますか?今すぐ入力をブロックします。Goでgit cloneのクレデンシャルプロンプトを無効にするにはどうすればよいですか?

+0

Stdinに 'nil'を渡そうとしましたか? https://golang.org/pkg/os/exec/#Cmdまた、以下の例をCommandContextとStdinPipeで調べます。 –

+0

@EugeneLisitskyはい、何もしません。 golang.org/pkg/os/exec/#Cmd.StdinPipeはstdinPipeを閉じるようなようですが、コマンドをブロックしておく必要があります。私はまだパスワードを求められます。 – sreya

+0

解決策を質問の編集ではなく回答として投稿してください[ツアー] –

答えて

1

更新:特別なgitソリューションです。

v 2.3 gitは環境設定GIT_TERMINAL_PROMPT=0をサポートしているので、資格情報を要求しませんが失敗します。

func main() { 
    cmd := exec.Command("git", "clone", "https://github.com/some/non-existing-repo") 
    os.Setenv("GIT_SSH_COMMAND", "ssh -oBatchMode=yes") // 
    cmd.Env = append(os.Environ(), "GIT_TERMINAL_PROMPT=1", "GIT_SSH_COMMAND='ssh -oBatchMode=yes'") 

    cmd.Stdout = os.Stdout 
    err := cmd.Run() 
    if err != nil { 
     log.Println("Error: ", err) 
    } 
} 
+0

これはうまくいきます。唯一の問題は、入力を求めるプロンプトが表示されなくても 'Read()'がまだ呼び出されるということです。パスワードを尋ねるプロンプトが表示されない場合でもクローンopを実行する – sreya

+0

私はこの回答をほとんど書きましたが、最初にドキュメントをダブルチェックしました。これは実際には機能しません。私はうまくいく解決策を思いつくことができませんでしたが、私は非常に頑張っていませんでした...(なぜ動作しなければこれは受け入れられますか?) –

+0

私はチェックしました - はい 'git'は読み込みを試みますstdinでも必要ない。そのような状況を区別する方法が必要です。 –

0

SSHソリューション:

受け入れ答えが唯一のhttpクローンで動作します。あなたはSSHでこれを行うための方法をしたい場合は、以下は動作します:これらの環境変数のいずれかが設定されている場合は、Gitは、フェッチとGitのプッシュが を使用しますGIT_SSH_COMMAND

ため

//disables stdin prompts for username/password. If passwordless-ssh isn't configured we want to fail 
os.Setenv("GIT_SSH_COMMAND", "ssh -oBatchMode=yes") 
cmd := exec.Command(name, args...) 
return cmd.CombinedOutput() 

man gitエントリをリモートシステムに接続する必要があるときにsshの代わりに指定されたコマンドを実行します。コマンドの には正確に2つまたは4つの引数が与えられます:URLからのusername @ host(または単にホスト)とそのリモートシステム上で実行するシェルコマンド (任意では-p(文字通り)で始まり、 ポート) URLがデフォルトのSSHポート以外を指定している場合はURL。

$ GIT_SSH_COMMANDは$ GIT_SSHよりも優先され、シェルによって解釈され、 追加の引数が含まれます。 $ GIT_SSHは、 プログラムへのパスでなければなりません(追加の引数が必要な場合は、ラッパーシェルスクリプトとなります)。

通常、個人用の.ssh/configファイルで任意のオプションを設定する方が簡単です。 詳細については、sshのマニュアルを参照してください。

man gitGIT_TERMINAL_PROMPT

のエントリこの環境変数が0に設定されている場合( がHTTP認証を要求する場合、例えば)、Gitは端末に要求しません。

1

代わりにgitを使用するネイティブゴーランの解決法はどうですか?これはプログラムがgitを必要とせず、stdinとgitバイナリに問題がないことを意味します。この例をhttps://godoc.org/gopkg.in/src-d/go-git.v4からチェックアウトしてください。プラスは、ドキュメントが本当に良いです、これは、プロジェクトのexamplesページからです。また、sshプロトコルもサポートしています。ここにはgitとこのプロジェクトのfull comparisonがあります。

import (
    "fmt" 
    "os" 

    "gopkg.in/src-d/go-git.v4" 
    . "gopkg.in/src-d/go-git.v4/_examples" 
) 

// Basic example of how to clone a repository using clone options. 
func main() { 
    url := "https://github.com/some/non-existing-repo" 
    directory := "/foo/bar" 

    // Clone the given repository to the given directory 
    Info("git clone %s %s --recursive", url, directory) 

    r, err := git.PlainClone(directory, false, &git.CloneOptions{ 
     URL:    url, 
     RecurseSubmodules: git.DefaultSubmoduleRecursionDepth, 
    }) 

    CheckIfError(err) 

} 
関連する問題