私はGoでgit clone
と同等の機能を実行しようとしていますが、stdinからの入力を求められたらコマンドを終了したい(例:sshキーがリモートリポジトリに設定されていない場合の認証)。これを行う方法はありますか?今すぐ入力をブロックします。Goでgit cloneのクレデンシャルプロンプトを無効にするにはどうすればよいですか?
答えて
更新:特別な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)
}
}
これはうまくいきます。唯一の問題は、入力を求めるプロンプトが表示されなくても 'Read()'がまだ呼び出されるということです。パスワードを尋ねるプロンプトが表示されない場合でもクローンopを実行する – sreya
私はこの回答をほとんど書きましたが、最初にドキュメントをダブルチェックしました。これは実際には機能しません。私はうまくいく解決策を思いつくことができませんでしたが、私は非常に頑張っていませんでした...(なぜ動作しなければこれは受け入れられますか?) –
私はチェックしました - はい 'git'は読み込みを試みますstdinでも必要ない。そのような状況を区別する方法が必要です。 –
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 git
GIT_TERMINAL_PROMPT
のエントリこの環境変数が0に設定されている場合( がHTTP認証を要求する場合、例えば)、Gitは端末に要求しません。
代わりに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)
}
- 1. Gitで公開鍵のアクセス許可チェックを無効にするにはどうすればよいですか?
- 2. いくつかのプロジェクトと他のプロジェクトでgitを無効にするにはどうすればVisual Studioコードでgitを無効にできますか?
- 3. jqgridローカルキャッシュを無効にするにはどうすればよいですか?
- 4. Crawler4Jロガーを無効にするにはどうすればよいですか?
- 5. iPadサポートを無効にするにはどうすればよいですか?
- 6. Ctrl + F4を無効にするにはどうすればよいですか?
- 7. WM6.5.3ジェスチャーを無効にするにはどうすればよいですか?
- 8. ピボットフリックイベントを無効にするにはどうすればよいですか?
- 9. invalidate()を無効にするにはどうすればよいですか?
- 10. Djangoクエリキャッシュを無効にするにはどうすればよいですか?
- 11. クエリキャッシュを無効にするにはどうすればよいですか?
- 12. TextBlockを無効にするにはどうすればよいですか?
- 13. "dijit.form.FilteringSelect"ウィジェットを無効にするにはどうすればよいですか?
- 14. should.jsを無効にするにはどうすればよいですか?
- 15. ASP:Panelを無効にするにはどうすればよいですか?
- 16. tomcatを無効にするにはどうすればよいですか?
- 17. LinkLabel TabStopを無効にするにはどうすればよいですか?
- 18. scrollViewを無効にするにはどうすればよいですか?
- 19. ランキットを無効にするにはどうすればよいですか?
- 20. GestureListenerを無効にするにはどうすればよいですか?
- 21. pyqt4 QGraphicsView.mousePressEventを無効にするにはどうすればよいですか?
- 22. ドッカースワームモードを無効にするにはどうすればよいですか?
- 23. Android:デスクトップを無効にするにはどうすればよいですか?
- 24. Yiiエラーページを無効にするにはどうすればよいですか?
- 25. クリックボタンを無効にするにはどうすればよいですか?
- 26. ポリラインクリックオーバーレイを無効にするにはどうすればよいですか?
- 27. マルチタッチを無効にするにはどうすればよいですか?
- 28. Specflow Intellisenseを無効にするにはどうすればよいですか?
- 29. org.apache.catalina.core.ApplicationContext logを無効にするにはどうすればよいですか?
- 30. ビュークローズオプションを無効にするにはどうすればよいですか?
Stdinに 'nil'を渡そうとしましたか? https://golang.org/pkg/os/exec/#Cmdまた、以下の例をCommandContextとStdinPipeで調べます。 –
@EugeneLisitskyはい、何もしません。 golang.org/pkg/os/exec/#Cmd.StdinPipeはstdinPipeを閉じるようなようですが、コマンドをブロックしておく必要があります。私はまだパスワードを求められます。 – sreya
解決策を質問の編集ではなく回答として投稿してください[ツアー] –