Bagaimana cara mendapatkan pinentry-curses untuk memulai pada tty yang benar?

13

Saya gunakan gpg-agentuntuk mengelola kedua identitas PGP e SSH. Agen dimulai dengan skrip seperti ini

gpg_agent_env="$XDG_CACHE_HOME/gpg-agent.env"

export GPG_TTY="$(tty)"

if ! ps -U "$USER" -o ucomm | grep -q gpg-agent; then
    eval "$({gpg-agent --daemon | tee $gpg_agent_env} 2> /dev/null)"
else
    source "$gpg_agent_env" 2> /dev/null
fi

yang bersumber setiap kali saya menjalankan shell interaktif. Semuanya berfungsi dengan baik dengan pengaturan ini tetapi ada masalah. Katakanlah saya:

  1. buka terminal (meluncurkan agen di latar belakang) dan mulai bekerja
  2. setelah beberapa saat buka terminal kedua
  3. lakukan tindakan yang mengharuskan Anda memasukkan frasa sandi di terminal kedua

Pada titik ini gpg-agentakan mulai pinentry-cursesmendorong frasa sandi tetapi akan melakukan ini di terminal pertama yang menghasilkan output yang bercampur dengan apa pun yang sedang berjalan (biasanya editor teks) tanpa ada cara untuk melanjutkan program atau menghentikan pinentry (mulai menggunakan cpu 100% dan saya harus membunuhnya).

Saya pasti melakukan sesuatu yang salah di sini. Adakah yang pernah mengalami ini?

Memperbarui:

Saya tahu ini terjadi hanya untuk prompt untuk membuka kunci SSH, yang terlihat seperti ini , sementara meminta kunci PGP selalu terbuka pada tty yang benar (yaitu saat ini).

Rnhmjoj
sumber
Sudahkah Anda mencoba memulai agen dari shell login Anda, jadi Anda hanya menjalankan satu agen?
jasonwryan
@jasonwryan Saya baru saja mencoba: Ini adalah hal yang sama untuk terminal virtual linux (agetty). By the way dalam pertanyaan dengan terminal yang saya maksud adalah jendela terminal emulator.
Rnhmjoj
1
Itu export GPG_TTY="$(tty)"yang diperbaiki untuk saya
naisanza

Jawaban:

11

The Halaman gpg-agent pria menjelaskan di bawah opsi --enable-ssh-supportbahwa protokol agen ssh tidak mampu memberikan nama tty ke agen, jadi default untuk menggunakan terminal awal itu dimulai pada. Sebelum menjalankan perintah ssh yang membutuhkan frasa sandi di terminal baru yang harus Anda ketik

gpg-connect-agent updatestartuptty /bye

di terminal baru untuk memperbarui pandangan agen yang tty atau tampilan untuk digunakan.

meuh
sumber
1
Jawaban ini membantu saya sepenuhnya menutupi realisasi ini: orang-orang yang bertanggung jawab untuk gpg2tidak memiliki konsep bagaimana rasanya memiliki alur kerja / gaya hidup yang terpusat pada command-line-centric. Entah bagaimana orang-orang yang konsep dasarnya tentang pengalaman pengguna komputer tipikal dimulai dan berakhir dalam batas-batas jendela GUI harus membuat keputusan yang mempengaruhi alat yang sebelumnya dapat digunakan dengan nyaman pada command-line.
mtraceur
2
@ mtraceur Tidak juga, ini ssh-agent salah di sini: sebenarnya gpg2 akan menampilkan prompt di tty kanan ketika membuka kunci kunci PGP. Mereka yang bertanggung jawab atas ssh-agent yang mungkin tidak pernah berpikir untuk beralih ke tty yang berbeda.
Rnhmjoj
2
@Rnhmjoj Haruskah orang SSH mendukung usecase TTY-switching yang tidak diinginkan alat baris perintah untuk sebagian besar sejarah Unix / Linux? Apakah Anda tahu bagaimana proses pemikiran desain dan keputusan untuk bagian alur kerja mana yang ditangani oleh perintah dan yang ditangani oleh agen? Jika ya, mungkin Anda bisa membantu saya melihat sesuatu yang saya lewatkan, karena saya tidak bisa melihat jalur yang jelas tentang bagaimana kebutuhan agen untuk "mengganti" TTYs bahkan akan muncul kecuali arsitektur diputuskan tanpa mempertimbangkan penggunaan baris perintah dan alur kerja yang umum.
mtraceur
1
@ ArneBabenhauserheide Perbedaannya adalah bahwa gpgtidak pernah dapat meminta kata sandi pada terminal yang salah, sedangkan gpg2dengan mudah bisa. The gpgperintah akan selalu meminta frasa sandi pada terminal Anda dieksekusi perintah dari karena benar-benar menciptakan kata sandi itu dilakukan dari yang pohon proses. Tapi gpg2dikodekan sedemikian rupa sehingga tidak dapat memastikan bahwa, karena memiliki meminta proses agen berjalan lama terpisah untuk cepat untuk passphrase, dan bahwa agen mungkin awalnya dimulai pada terminal yang berbeda. gpg2dan agen bisa, tetapi tidak, diberi kode untuk mengatasi itu.
mtraceur
1
@ArneBabenhauserheide Kecuali Anda bertanya tentang perbedaan antara agen SSH dan gpg2? Karena jika demikian, maka perbedaannya adalah bahwa SSH tidak pernah memerlukan penyimpangan dari perkakas lain ini harus secara proaktif memberi tahu agennya secara khusus untuk mengganti terminal di latar belakang (sejauh yang saya tahu - dan jika itu terjadi maka saya memiliki kritik yang sama untuk itu juga ). The gpg2desain hanya masuk akal jika dilaksanakan oleh orang yang tidak grok aspek CLI-relevan tentang bagaimana Linux / Unix bekerja, dan tidak memiliki rasa yang baik dari apa yang membuat antarmuka dan perkakas baik untuk menyusun dalam kombinasi yang sewenang-wenang.
mtraceur
5

Sesuai bug hulu terhadap openssh, cara yang tepat untuk ini adalah menambahkan yang berikut ke Anda ~/.ssh/config:

Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"

Sejauh ini, ini berhasil bagi saya.

smaslennikov
sumber
1
Catatan yang GPG_TTYharus diatur $(tty)untuk membuat ini berfungsi.
Peter