SSH 구성(~/.ssh/config)의 명령에 대한 쉘을 무시합니다.

SSH 구성(~/.ssh/config)의 명령에 대한 쉘을 무시합니다.

Match exec그래서 IP에서 일부 일치 항목을 얻기 위해 사용하는 사용자를 위한 SSH 구성 파일이 있습니다 .

Match exec "echo %h | grepcidr 192.168.12.0/20  &>/dev/null "
  User         ubuntu
  ProxyCommand          ssh my-bastion -W %h:%
  IdentityFile          ~/.ssh/target.pem

이것은 내 호스트에서 잘 작동하지만 openssh-client가 설치된 컨테이너에서 실행하려고 시도했지만 명령이 성공한 것으로 간주하기 때문에 ssh 연결이 실패합니다(네트워크를 대상으로 하지 않는 경우에도). , 그래서 요새를 통과하려고 시도할 것입니다.

debug1: Executing command: 'echo my.host.com | grepcidr 192.168.12.0/20 &>/dev/null '
debug3: command returned status 0

내 호스트에서 반환됩니다.

debug1: Executing command: 'echo my.host.com | grepcidr 192.168.12.0/20 &>/dev/null '
debug3: command returned status 1

컨테이너 ssh 명령이 반환하는 내용은 무엇입니까?

조사해본 결과 컨테이너의 ssh 명령은 다음을 사용하여 실행되는 것으로 나타났습니다. sh -c반면 내 호스트에서 실행된 ssh 명령은 bash -c 명령줄에서 테스트하고 반환 값을 확인하여 이것이 원인임을 확인할 수 있습니다. 명령하다echo $?

ssh 명령에만 사용하도록 지정하는 방법이 있습니까 bash?

SHELL명령줄 시작 부분에서 환경 변수를 재정의할 수 있습니다.

SHELL=/bin/bash ssh [email protected]

하지만 내 목표는 그 모든 것 뒤에 ansible을 사용하는 것이므로 모든 SSH에 대해 셸을 검증하고 싶습니다.

답변1

로 시작하는 대체 명령을 지정 bash -c하거나 Bashism(즉, &>stdout-and-stderr 리디렉션)을 삭제할 수 있습니다.

Match execC 함수 와 같은 것을 사용하므로 어떤 system()쉘을 제공할지 결정하는 것은 런타임 시스템(C 라이브러리)에 달려 있습니다. 대부분의 Unix 시스템에서는 sh -c전체 명령줄을 더한 것으로 해석됩니다 . 이 부분은 변경할 수 없습니다.

관련 정보