Benarkah cara verbose untuk menguji koneksi Git melalui SSH?

109

Saat menggunakan GIT, saya memiliki masalah dengan menggunakan GIT lebih dari SSH , dan karena berfungsi dengan baik baik dari kantor, dan di rumah dengan modem yang berbeda, jelas modem rumah saya yang bertindak. Saya tidak punya masalah menghubungkan melalui HTTP.

Jadi, saya berasumsi itu adalah masalah SSH, tapi saya bukan ahli menggunakannya secara langsung. Apakah ada perintah yang bisa saya jalankan yang mengatur koneksi "test", dan beri tahu saya kapan dan di mana sepanjang masalah terjadi?

Hampir semua "lebih besar" perintah (seperti fetch, cloneatau pushdengan data banyak) dari git(bahkan ketika menjalankan dengan -v) hanya "menggantung" di tengah-tengah yang menghubungkan jarak jauh dengan tidak ada indikasi mengapa mereka telah berhenti, sehingga mereka tidak ada gunanya .

Apakah ada cara saya bisa mendapatkan rincian lebih lanjut tentang apa yang terjadi dalam koneksi SSH?

IQAndreas
sumber

Jawaban:

113

Variabel lingkungan

Dari Git versi 2.3.0, Anda dapat menggunakan variabel lingkungan GIT_SSH_COMMANDdan meneruskan -vargumen verbose seperti ini:

GIT_SSH_COMMAND="ssh -v" git clone example

Untuk menjadi ekstra verbose, buat -vvv:

GIT_SSH_COMMAND="ssh -vvv" git clone example

Git config

Dari Git versi 2.10.0, yang akan ada dalam repo Ubuntu 17.04, Anda dapat menyimpan konfigurasi ini secara global, atau per repo seperti dalam contoh ini:

git config core.sshCommand "ssh -vvv"
git pull
Flimm
sumber
Bagi saya setidaknya, Jika saya melakukan ini: GIT_SSH_COMMAND="ssh -v" git clone exampleSaya bisa men-debug versi SSH, itu dicetak setelah Cloning intopesan, tetapi gagal di git clone. Setelah saya menghapusnya GIT_SSH_COMMANDberfungsi. Pada akhirnya, melayani tujuan.
Paulo Oliveira
5
Untuk satu kali ini akan lebih baik:git -c core.sshCommand="ssh -vvv" pull
Joseph K. Strauss
git config --global core.sshCommand "ssh -vvv" git clone example
Azodium
81

Saya punya masalah serupa. Untuk debugging, saya menambahkan baris di ssh_config saya. Inilah cara saya melakukannya:

git remote -v

Di sana Anda akan menemukan garis seperti ini:

origin  [email protected]:me/test.git (fetch)
origin  [email protected]:me/test.git (push)

Dalam hal ini tuan rumah github.com. Sekarang Anda dapat menambahkan Host-Entry di konfigurasi ssh Anda:

vim ~/.ssh/config

Dan tambahkan:

Host github.com
    LogLevel DEBUG3

Saat menggunakan operasi git, Anda harus mendapatkan banyak pesan debug, sekarang. Untuk mendapatkan pesan debug yang lebih sedikit, coba gunakanDEBUG1

Untuk versi GIT> = 2.3.0 lihat jawaban dari @Flimm untuk solusi yang lebih cerdas.

Trendfischer
sumber
14

Membaca man git, ada beberapa variabel lingkungan berguna yang dapat Anda atur, GIT_TRACE_PACKETdan GIT_TRACE. Sebagai contoh:

GIT_TRACE_PACKET=true git clone ssh://[...]

Agak terlambat untuk permainan, tapi semoga ini membantu seseorang!

bcherny
sumber
1
Ini membantu, tetapi Anda tidak mendapatkan pesan apa pun tentang masalah koneksi dengan SSH. Tetapi jika koneksi SSH berfungsi, ini adalah cara untuk debug lebih lanjut.
Trendfischer
5

Per man ssh:

 -v      Verbose mode.  Causes ssh to print debugging messages about its progress.  This
         is helpful in debugging connection, authentication, and configuration problems.
         Multiple -v options increase the verbosity.  The maximum is 3.

Jadi, cobalah ssh -v. Jika itu tidak memberi tahu Anda apa yang perlu Anda ketahui, Anda dapat menambahkan satu atau dua vuntuk informasi debug lebih rinci. Untuk Github khususnya, cobalah ssh -vvvT [email protected].

Biasanya, dalam pengalaman saya, sesi SSH yang menggantung selama pengaturan terjadi ketika klien tidak dapat menyelesaikan metode otentikasi yang dipilih. Pastikan kunci pribadi Anda ada di tempat yang tepat dengan izin yang tepat dan cocok dengan kunci publik yang Anda berikan kepada Github.

tgies
sumber
Terima kasih atas jawabannya, tetapi saya mungkin seharusnya mengajukan pertanyaan secara berbeda (karena GitHub tidak mengizinkan koneksi SSH langsung seperti itu). Saya mengedit posting dan judul, tetapi apakah lebih baik membuang yang ini dan membuat pertanyaan baru?
IQAndreas
@IQAndreas, GitHub mengizinkan koneksi SSH seperti itu dalam arti bahwa fase otentikasi akan dilakukan dan jika masalah memang terjadi pada langkah SSH, Anda akan melihatnya seperti itu. Jika Anda menemukan bahwa Anda bahkan tidak bisa sejauh itu, ada sesuatu yang terjadi yang membuat sambungan tidak dapat dibuat.
tgies
1
Saya sedang dikonfirmasi, dan kadang-kadang push/ pullpada repo tanpa masalah. Tetapi seringkali itu hanya "hang" di tengah-tengah perintah dan tidak akan berlanjut (terutama ketika saya mentransfer sejumlah besar data seperti besar cloneatau push). Tidak ada pesan kesalahan, hanya ada di sana dan tidak melanjutkan.
IQAndreas
3

Saya tidak melihat cara untuk memberitahu git (1) perintah eksternal yang digunakan untuk ssh (1), tetapi sebagai solusi, cukup ganti nama / path / ke / ssh ke /path/to/ssh.orig, buat shell skrip wrapper / path / ke / ssh, dan tambahkan flag -v:

$ sudo mv /usr/bin/ssh /usr/bin/ssh.orig
$ sudo vim /usr/bin/ssh
$ cat /usr/bin/ssh
#!/bin/sh

if [ -x /usr/bin/ssh.orig ]; then
    exec /usr/bin/ssh.orig -v -v -v "${@}"
fi

$ sudo chmod a+x /usr/bin/ssh

Saya mendapatkan output verbose ketika menjalankan perintah git yang beroperasi melalui transport ssh. Setelah selesai debugging, hapus skrip dan kembalikan /path/to/ssh.orig ke / path / ke / ssh.

ScoobiFreeBSD
sumber
4
Alih-alih memindahkan file /usr/bin, pertimbangkan untuk memasukkan skrip wrapper /usr/local/bin.
muru
2
Setidaknya pada instalasi Windows saya yang aneh, variabel lingkungan GIT_SSHdapat diatur untuk menunjuk ke biner yang Anda ingin Git gunakan.
Coderer
Seperti yang dikatakan, Anda pasti tidak ingin memodifikasi file ssh asli, tapi saya akan ragu tentang solusinya di / usr / local /. Itu tidak transparan, dan mudah diinjak. LEBIH BAIK: letakkan skrip penyelesaian masalah Anda ke dalam $ HOME / bin dan tambahkan dir bin baru itu dalam variabel $ PATH pengguna Anda, di atas segmen PATH lainnya. Dan sebelum melakukan itu, saya akan memeriksa apakah tidak ada solusi ENV var yang lebih baik (jawaban ini sudah tua).
Scott Prive