SSH 연결이 스크립트를 통해 작동하지 않습니다

SSH 연결이 스크립트를 통해 작동하지 않습니다

다음 줄을 하나씩 실행하면 완벽하게 작동합니다.

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 ...myusernamesudo -i

답변1

대화식으로 명령을 입력하는 것과 명령을 실행하는 스크립트의 차이점에 대해 제가 생각하는 것은 다음과 같습니다.

wpa_supplicant명령은 SSH에 필요한 네트워크 링크를 엽니다. ssh 명령이 호출될 때 네트워크 링크가 작동되지 않으면 어떻게 됩니까? 내 집 컴퓨터에서는 연결을 시작하는 SYN 패킷을 수신하는 사람이 없기 때문에 ssh 명령이 오랫동안 중단됩니다. 그런 다음 SSH가 시간 초과되고 오류를 보고합니다. 스크립트와 동일한 증상입니다(Ssh 오류를 기다릴지 여부를 언급하지 않았지만).

wpa_supplicant명령과 명령을 수동으로 입력하는 경우 ssh그 사이에 5~7초가 있을 수 있으며 이는 ssh 명령이 시작되기 전에 네트워크 링크가 설정되는 데 충분한 시간입니다. 스크립트가 명령을 실행할 때 그 사이에는 시간이 거의 없으며 ssh가 첫 번째 SYN 패킷을 보낼 때 링크가 아직 준비되지 않았습니다.

sleep 10내 조언은 과 사이의 경계가 당신에게 적합한 지 확인하는 것입니다 .echosudo ... ssh ...

답변2

원래 답변

귀하의 문제는 클라이언트 측이 아니라 sshpass서버 측에 있다고 생각합니다 .sshsudo

비밀번호를 설정하는 한 가지 방법은 변수를 설정하는 것입니다 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옵션을 추가하십시오 .-Asudo

나는 당신이 명령 줄을 시작할 수 있다고 생각합니다

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.

관련 정보