Làm thế nào để có được pinentry-nguyền rủa để bắt đầu đúng tty?


13

Tôi sử dụng gpg-agentđể quản lý cả hai danh tính PGP e SSH. Các tác nhân được bắt đầu với một kịch bản như thế này

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

được cung cấp bất cứ khi nào tôi chạy một vỏ tương tác. Tất cả mọi thứ hoạt động tốt với thiết lập này nhưng có một vấn đề. Hãy nói tôi:

  1. mở một thiết bị đầu cuối (khởi chạy tác nhân trong nền) và bắt đầu làm việc
  2. sau một thời gian mở một thiết bị đầu cuối thứ hai
  3. thực hiện một hành động yêu cầu nhập cụm mật khẩu trong thiết bị đầu cuối thứ hai

Tại thời điểm gpg-agentnày sẽ bắt đầu pinentry-cursesnhắc một cụm mật khẩu nhưng nó sẽ thực hiện điều này trong thiết bị đầu cuối đầu tiên dẫn đến kết quả đầu ra của nó bị trộn lẫn với bất cứ thứ gì đang chạy (thường là trình soạn thảo văn bản) mà không có cách nào để tiếp tục chương trình hoặc dừng pinentry (nó bắt đầu sử dụng 100% cpu và tôi phải giết nó).

Tôi phải làm điều gì đó sai ở đây. Bất cứ ai đã có kinh nghiệm này?

Cập nhật:

Tôi đã tìm ra điều này chỉ xảy ra đối với lời nhắc mở khóa khóa SSH, trông giống như thế này , trong khi lời nhắc cho khóa PGP luôn mở trên tty chính xác (tức là hiện tại).


Bạn đã thử bắt đầu đại lý từ vỏ đăng nhập của mình, vì vậy bạn chỉ có một hoạt động?
jasonwryan

@jasonwryan Tôi vừa thử: Đó là điều tương tự đối với các thiết bị đầu cuối ảo linux (agetty). Nhân tiện trong câu hỏi với thiết bị đầu cuối tôi có nghĩa là một cửa sổ giả lập thiết bị đầu cuối.
Rnhmjoj

1
Nó đã được export GPG_TTY="$(tty)"sửa nó cho tôi
naisanza

Câu trả lời:


10

Các trang gpg-agent người đàn ông giải thích dưới tùy chọn --enable-ssh-supportmà giao thức đại lý ssh là không thể cung cấp tên của tty đến đại lý, vì vậy nó mặc định để sử dụng các thiết bị đầu cuối ban đầu nó được bắt đầu vào. Trước khi chạy lệnh ssh mà đòi hỏi một cụm mật khẩu trong một thiết bị đầu cuối mới, bạn cần nhập

gpg-connect-agent updatestartuptty /bye

trong thiết bị đầu cuối mới để cập nhật chế độ xem của đại lý sẽ sử dụng tty hoặc hiển thị.


1
Câu trả lời này đã giúp tôi hoàn toàn đồng ý với nhận thức này: những người chịu trách nhiệm gpg2không có khái niệm gì về việc có một quy trình / lối sống tập trung vào dòng lệnh. Bằng cách nào đó, những người có khái niệm cơ bản về trải nghiệm người dùng máy tính điển hình bắt đầu và kết thúc trong ranh giới của các cửa sổ GUI đã đưa ra quyết định ảnh hưởng đến một công cụ mà trước đây có thể sử dụng thoải mái trên dòng lệnh.
mtraceur

2
@mtraceur Không thực sự, đó là lỗi ssh-agent tại đây: trên thực tế gpg2 sẽ hiển thị lời nhắc bên phải tty khi mở khóa PGP. Đó là những người chịu trách nhiệm về ssh-agent mà có lẽ không bao giờ nghĩ đến việc chuyển sang một tty khác.
Rnhmjoj

2
@Rnhmjoj Các anh chàng SSH có nên hỗ trợ một usecase chuyển đổi TTY mà không có công cụ dòng lệnh nào cho hầu hết lịch sử Unix / Linux muốn không? Bạn có biết làm thế nào quá trình suy nghĩ thiết kế và quyết định cho chính xác phần nào của quy trình công việc được xử lý bởi lệnh và phần nào được xử lý bởi tác nhân đã được thực hiện? Nếu là bạn, có lẽ bạn có thể giúp tôi nhìn thấy thứ gì đó tôi đang thiếu, bởi vì tôi không thể thấy một con đường rõ ràng về việc nhu cầu "chuyển đổi" TTYs thậm chí sẽ phát sinh như thế nào trừ khi kiến ​​trúc được quyết định mà không xem xét sử dụng dòng lệnh và quy trình công việc điển hình.
mtraceur

1
@ArneBabenhauserheide Sự khác biệt là gpgkhông bao giờ có thể yêu cầu cụm mật khẩu trên thiết bị đầu cuối sai, trong khi gpg2dễ dàng có thể. Các gpglệnh sẽ luôn yêu cầu cụm mật khẩu trên các thiết bị đầu cuối, bạn thực hiện lệnh từ vì thực sự tạo ra các mật khẩu đã được thực hiện từ đó cây quá trình. Nhưng gpg2được mã hóa sao cho nó không thể đảm bảo điều đó, bởi vì nó phải yêu cầu một quy trình tác nhân chạy dài riêng biệt để nhắc cụm mật khẩu và tác nhân đó có thể đã bắt đầu trên một thiết bị đầu cuối khác. gpg2và các tác nhân có thể, nhưng không, được mã hóa để làm việc xung quanh đó.
mtraceur

1
@ArneBabenhauserheide Trừ khi bạn hỏi về sự khác biệt giữa tác nhân SSH và gpg2? Bởi vì nếu như vậy, thì sự khác biệt là SSH mà không bao giờ đòi hỏi sự xuyên tạc này của các dụng cụ khác phải chủ động nói với đại lý của nó đặc biệt để thiết bị đầu cuối công tắc ở chế độ nền (như xa như tôi biết - và nếu nó đã làm sau đó tôi có những lời chỉ trích tương tự cho quá ). Các gpg2thiết kế chỉ có ý nghĩa nếu được thực hiện bởi những người không grok các khía cạnh CLI-có liên quan như thế nào Linux / Unix hoạt động, và không có một cảm giác tốt về những gì làm cho giao diện và công cụ tốt cho việc soạn thảo trong các kết hợp tùy ý.
mtraceur

5

Theo lỗi ngược dòng với openssh, cách thích hợp cho việc này là thêm các mục sau vào ~/.ssh/config:

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

Điều này đã làm việc cho tôi hoàn hảo cho đến nay.


1
Lưu ý rằng GPG_TTYphải được thiết lập $(tty)để làm cho công việc này.
Peter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.