명령줄 매개변수만

명령줄 매개변수만

man ssh설명하다:

SSH_ASKPASS
   If  ssh needs a passphrase, it will read the passphrase from the
   current terminal if it was run from a terminal.  If ssh does not
   have  a  terminal associated with it but DISPLAY and SSH_ASKPASS
   are set, it will execute the program  specified  by  SSH_ASKPASS
   and open an X11 window to read the passphrase.

SSH가 터미널에서 실행되더라도 Askpass 프로그램을 사용하도록 하고 싶습니다.

때때로 서버에 연결해야 하는데 비밀번호 프롬프트가 표시될 때 약간의 지연이 발생합니다(네트워크 문제 때문일 수도 있고 역방향 DNS 조회 시도 때문일 수도 있습니다...). 짜증이 나서 다른 일을 하다가 연결 시도를 잊어버렸습니다. (금붕어 집중력에 대한 농담을 삽입하세요.) 마침내 다시 돌아왔을 때 프롬프트 시간이 초과되었고 올바른 비밀번호를 입력해도 연결이 끊어졌습니다.

키는 하나의 솔루션이지만 제가 사용하는 모든 시스템에 공통 SSH 키가 있는 것은 아닙니다. 하지만 저는 주로 Ubuntu 시스템을 사용하는데, Ubuntu에는 기본적으로 SSH Askpass 프로그램이 설치되어 있습니다.

그런데 쿼리가 뜨면 바로 알아차립니다. 내가 할 수만 있다면 이것은 나에게 충분한 타협이다.

답변1

OpenSSH 8.4를 사용하면 $SSH_ASKPASS_REQUIRE환경 변수를 force.reference 로 설정할 수 있습니다.SSH(1)매뉴얼 페이지:

 SSH_ASKPASS_REQUIRE   Allows further control over the use of
                       an askpass program.  If this variable
                       is set to "never" then ssh will never
                       attempt to use one.  If it is set to
                       "prefer", then ssh will prefer to use
                       the askpass program instead of the TTY
                       when requesting passwords.  Finally, if
                       the variable is set to "force", then
                       the askpass program will be used for
                       all passphrase input regardless of
                       whether DISPLAY is set.

OpenSSH 8.4 출시로2020년 9월 27일주요 Linux 배포판에서 이 기능을 사용할 수 있으려면 잠시 기다려야 합니다.

답변2

이는 약간 복잡하지만 몇 가지 부분을 조합하면 작동합니다.

설명하다

  1. ssh프로그램 을 강제로 사용하기 위해서는 실제 프로그램을 볼 수 없도록 $SSH_ASKPASS허용할 수 없습니다 . 이것은 단지 조건일 뿐입니다. 이는 스위치를 사용하여 수행할 수 있습니다 .sshttysetsid-nssh

    이 경우 연결이 시작되지만 쉘과 상호 작용할 수 없습니다. 이는 아마도 귀하의 요구 사항이기도 합니다.;) (또한 로컬 TTY도 파괴됩니다).

    하지만 "첫 번째 세션"을 삭제할 수 있습니다. 또한 -N원격 명령을 억제하고 실행하는 스위치를 추가해야 합니다.그냥 인증.

    &> /dev/null이에 관심이 없으면 가능한 출력 "정크"를 해당 위치로 리디렉션할 수도 있습니다.

  2. ControlMaster에 설정하세요 ssh_config. 이것은 멋진 기능입니다. 일단 연결되면 세션을 매우 빠르게 "실행"할 수 있습니다. 이 코드는 ~/.ssh/config이를 수행해야 합니다:

    ControlPath ~/.ssh/controlmasters/%r@%h:%p
    ControlMaster auto
    ControlPersist 5m
    

    host"느린 후보자"가 나열된 일부 블록 에 추가하거나 아무 곳에나 추가할 수 있습니다 . 오버헤드가 거의 없습니다.

마지막 줄

그러면 다음과 같은 방법으로 시간이 걸릴 것으로 예상되는 호스트에 연결할 수 있습니다.

setsid ssh -nN host
# wait, insert password in the X11 prompt
ssh host
# will bring you directly to your session

bash 기능을 사용하여 두 프로세스를 한 단계로 수행하면 전체 프로세스가 alias단순화될 수 있지만 이는 독자의 상상에 달려 있습니다.

명령줄 매개변수만

ssh_config어느 부분도 없이 명령줄에서 두 부분을 결합할 수 있습니다 .

setsid ssh -nNMS ~/.ssh/masters/%C host
# wait, insert password in the X11 prompt
ssh -S ~/.ssh/masters/%C host
# will bring you directly to your session

SSH 옵션이 지정되지 않은 경우 다음 기능이 작동합니다.

ssh() {
    if ! command ssh -o PasswordAuthentication=no "$1" true
    then
        setsid -w ssh -fnN "$1"
    fi
    command ssh "$@"
}
  • -f프로그램이 실행되기 전(즉, 비밀번호를 검색한 후) SSH가 백그라운드로 이동하도록 지시합니다.
  • -wsetsid대기 프로그램이 종료되도록 지시합니다 . 이 경우 SSH가 백그라운드로 전환될 때 이런 일이 발생합니다. 와 함께 사용하면 ssh -f두 SSH 명령 간의 수동 대기를 제거할 수 있습니다.
  • 이 함수는 첫 번째 매개변수가 호스트 이름이라고 가정합니다.
  • 이 테스트는 불필요한 SSH 연결을 방지하기 위한 것입니다.

답변3

SSH 매뉴얼에 따라( man ssh):

ssh연관된 터미널이 없지만 DISPLAY 및 SSH_ASKPASS가 설정된 경우 SSH_ASKPASS에 지정된 프로그램을 실행합니다 .

따라서 터미널에서 연결을 해제하고(예: 파이프 추가) DISPLAY설정되어 있지 않은지 확인해야 합니다(터미널을 암호 문구로 사용하려는 경우).

간단한 예:

echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh ...

다음과 동일 ssh-add:

$ echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh-add id_rsa
ssh_askpass: exec(/my/cmd): No such file or directory

관련 정보