![SSH 연결이 스크립트를 통해 작동하지 않습니다](https://linux55.com/image/208390/SSH%20%EC%97%B0%EA%B2%B0%EC%9D%B4%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%ED%86%B5%ED%95%B4%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4.png)
다음 줄을 하나씩 실행하면 완벽하게 작동합니다.
sudo -i wpa_supplicant -B -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf;
echo "This echo still works.";
sudo -i sshpass -p mypassphrase ssh [email protected] -T 'sudo mkdir /home/myusername/myFolder';
그러나 이를 블록으로 실행하거나 스크립트 내에서 실행하면 다음과 같은 결과가 출력됩니다.
Successfully initialized wpa_supplicant
This echo still works.
마지막 줄은 영원히 이어집니다. 디렉터리도 생성되지 않습니다.
어떤 제안이라도 높이 평가하겠습니다.
편집 #1
지금까지 답변해 주셔서 감사합니다.
@Sotto Voce: 예, wpa_supplicant는 ssh에 필요한 연결을 시작합니다.
@sudodus: 답변해 주셔서 감사합니다. 이 문제를 재현하기 위해 SSH 명령줄에서 sudo를 사용할 필요는 없습니다. 내 원래 게시물이 혼란스러웠다면 죄송합니다. 어쨌든 단순화된 코드
sudo -i wpa_supplicant -B -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf;
echo "This echo still works.";
sshpass -p mypassphrase ssh [email protected] 'who';
같은 효과를 보여줍니다. 터미널에서 한줄씩 붙여넣고 실행하면 잘 됩니다. 그러나 모든 줄이 동시에 실행되는 경우(예: 스크립트에서) 항상 마지막 줄이 실행됩니다.
현재 제가 생각하고 있는 방향은: 터미널에서만 실행할 때와 미리 사용하면 허용되지 않을 수도 있는 조합으로 실행할 때 달라야 합니까?sshpass -p mypassphrase ssh [email protected] 'who';
sudo -i wpa_supplicant ...
myusername
sudo -i
답변1
대화식으로 명령을 입력하는 것과 명령을 실행하는 스크립트의 차이점에 대해 제가 생각하는 것은 다음과 같습니다.
이 wpa_supplicant
명령은 SSH에 필요한 네트워크 링크를 엽니다. ssh 명령이 호출될 때 네트워크 링크가 작동되지 않으면 어떻게 됩니까? 내 집 컴퓨터에서는 연결을 시작하는 SYN 패킷을 수신하는 사람이 없기 때문에 ssh 명령이 오랫동안 중단됩니다. 그런 다음 SSH가 시간 초과되고 오류를 보고합니다. 스크립트와 동일한 증상입니다(Ssh 오류를 기다릴지 여부를 언급하지 않았지만).
wpa_supplicant
명령과 명령을 수동으로 입력하는 경우 ssh
그 사이에 5~7초가 있을 수 있으며 이는 ssh 명령이 시작되기 전에 네트워크 링크가 설정되는 데 충분한 시간입니다. 스크립트가 명령을 실행할 때 그 사이에는 시간이 거의 없으며 ssh가 첫 번째 SYN 패킷을 보낼 때 링크가 아직 준비되지 않았습니다.
sleep 10
내 조언은 과 사이의 경계가 당신에게 적합한 지 확인하는 것입니다 .echo
sudo ... ssh ...
답변2
원래 답변
귀하의 문제는 클라이언트 측이 아니라 sshpass
서버 측에 있다고 생각합니다 .ssh
sudo
비밀번호를 설정하는 한 가지 방법은 변수를 설정하는 것입니다 SUDO_ASKPASS
. 내 주 컴퓨터의 파일에는 ~/.profile
다음 줄이 있습니다.
export SUDO_ASKPASS=/usr/bin/ssh-askpass
내가 확인할 수 있어
echo $SUDO_ASKPASS
그건 거기 있고 오고 있어
which ssh-askpass
프로그램도 있어야 할 곳에 있습니다. 이 특정 프로그램에는 GUI가 있으므로 ssh -X
게스트가 사용할 수 있도록 합니다. sshpass -p
서버 측에서도 이를 사용할 수 있습니다 (이러한 작업에 대한 액세스 권한이 있어야 함).
어쨌든 이것은 나에게 효과적입니다.
ssh -tX [email protected] 'source /home/myuser/.profile; sudo -A fdisk -lu /dev/sda'
sudo
클라이언트 컴퓨터의 바탕 화면에 나타나는 작은 창에 서버의 비밀번호를 입력한 다음 이를 sudo
실행 fdisk
하고 활성 터미널 창에 결과를 표시합니다.
귀하의 상황은 다를 수 있습니다. 먼저, 서버에서 적절한 암호화 프로그램을 확인/설치해야 합니다 sshpass
(원하지 않는 경우). 그런 다음 서버 측 에 ssh-askpass
옵션을 추가하십시오 .-A
sudo
나는 당신이 명령 줄을 시작할 수 있다고 생각합니다
sshpass -p password ssh ...
보안상의 이유로 나는 그것을 sudo
실행하는 데 사용하지 않을 것입니다. ssh
명시적인 비밀번호도 충분히 나쁘지만 때로는 높은 수준의 보안을 유지하는 것이 너무 큰 문제입니다.
편집 1:
첫 번째 피드백을 다시 테스트한 후 내 사용자 ID와 일치하도록 스크립트를 수정했는데 작동했지만 잘 작동하지는 않았지만 옵션 -t
(소문자 t)을 추가한 후에는 작동했습니다. 더 좋은 점은 SSH 세션을 관리하는 방법도 보여줍니다. 해당 줄은 나와 관련이 없기 때문에 주석 처리했습니다 wpa_supplicant
(무슨 일을 하는지는 모르겠지만 문제가 발생하지 않기를 바랍니다 ssh
).
내 스크립트 ssher
:
#!/bin/bash
#sudo -i wpa_supplicant -B -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf;
echo "This echo still works.";
sshpass -p mypassword ssh -t [email protected] 'who';
다음이 없는 런타임 -t
:
$ ./ssher
This echo still works.
olle tty7 2022-07-18 15:12 (:0)
-t
위 스크립트에 표시된 대로 Run 을 사용하십시오 .
$ ./ssher
This echo still works.
olle tty7 2022-07-18 15:12 (:0)
sudodus pts/1 2022-07-19 22:50 (192.168.0.12)
Connection to 192.168.0.2 closed.