프로세스 대체 <()가 ssh -F에서 작동하지 않는 이유


11

유능한 가상 머신이 있습니다. 그들에게 로그인하려면 vagrant ssh명령을 내립니다. 일반 ssh명령을 사용하여 로그인하고 싶습니다 . 은 vagrant ssh-config적절한 구성 파일을 출력한다

$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2201
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/cbliard/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

이 구성을 파일로 출력하고 with를 사용 ssh -F하면 모든 것이 잘 작동합니다.

$ vagrant ssh-config > /tmp/config
$ ssh -F /tmp/config default
=> logged successfully

프로세스 대체 연산자 <(cmd)를 사용 하여 임시 구성 파일을 작성하지 않으면 실패합니다.

$ ssh -F <(vagrant ssh-config) default
Can't open user config file /proc/self/fd/11: No such file or directory

사용할 때 동일한 오류가 발생합니다 <(cat /tmp/config)

$ ssh -F <(cat /tmp/config) default
Can't open user config file /proc/self/fd/11: No such file or directory

zsh를 사용하고 있으며 bash와 동일한 동작을 관찰합니다. 내가 여기서 뭘 잘못하고 있니?


2
ssh가 예기치 않은 파일 설명자를 모두 닫은 것 같습니다.
ctrl-alt-delor

답변:


10

명령 :

ssh -F <(vagrant ssh-config) default

vagrantstdout이 파이프에 연결된 별도의 프로세스에서 명령을 실행합니다 . 파이프의 다른 쪽 끝은 파일 설명자 n(귀하의 경우 11)가 실행 ssh되고 셸 이 실행되는 새 프로세스에 연결 됩니다.

ssh -F /proc/self/fd/n default

이제 ssh시작시 파일 설명자를 닫지 않은 경우에만 작동합니다 .

불행히도 그렇지 않습니다.

사용중인 경우 zsh, 대체가 사용하는 =(...)파이프를 사용하는 대신 여기서 프로세스 치환 형태와 /proc/self/fd는 임시 파일을 사용한다.

또는 ssh닫히지 않는 파일 설명자를 사용할 수 있습니다 . 예를 들어, ssh(원격 명령이 stdin에서 아무것도 읽지 않으면) 아무것도 공급 하지 않으면 fd0을 사용할 수 있습니다 .

vagrant ssh-config | ssh -F /dev/stdin -n default

1
훌륭한. 와 =(...)그것이 마치 마법처럼 작동하고 임시 파일이 때 자동으로 제거됩니다 ssh세션이 종료합니다. 가있는 변형 /dev/stdin은 성공적으로 연결되지만 즉시 종료됩니다.
cbliard

1
@cbliard, 그렇습니다. 다른 쪽 끝에서 실행하는 명령이 대화식 쉘인 경우 stdin (현재 사용되는 파이프 인 vagrant)에서 eof 및 exit를 읽습니다. 당신이 아무것도 먹이지 않으면ssh 내가 말한 이유 입니다.
Stéphane Chazelas

좋아, 나는 당신이 아무것도 먹이지 않으면ssh 무슨 의미인지 이해하지 못했다 . 이제 분명하다.
cbliard 2011

아직도 그래요? ssh -F <(cat ~/.ssh/config ~/.ssh/hosts)SSH를 실행할 때 2 개의 구성 파일을 결합하기 위해 성공적으로 사용하고 있습니다. 그리고 ZSH에서는 다음과 같이 할 수 있습니다 ssh -F <(vagrant ssh-config) default.
CMCDragonkai

1

@cbliard 기반

이것은 작동합니다 :

ssh -F =(vagrant ssh-config ) -i =(generate ssh-identity)

감사! 무엇을 분명히 할 수 있습니까 =( )? 익숙하지 않습니다.
cbliard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.