쉘 스크립트를 사용하여 원격 서버에서 실행할 때 명령을 찾을 수 없습니다.

쉘 스크립트를 사용하여 원격 서버에서 실행할 때 명령을 찾을 수 없습니다.

원격 Linux 시스템에서 수행해야 하는 로컬 우분투 시스템의 일부 단계를 자동화하려고 합니다.

내 쉘 스크립트는 다음과 같습니다.

#!/bin/sh

ssh XYZ '

qlogin -l cuda=1

'

콜렉트를 통과하려고 하면 ./fileName.sh(상태)

bash: line 2: qlogin: command not found

그러나 이 작업을 수동으로 수행하면(즉, 클러스터에 ssh를 실행하고 이 명령을 실행하는 경우) 실행할 수 있습니다.

현재 문제 해결

  1. 로컬 터미널과 원격 터미널 모두 bash입니다. 이건 내가 얻었어echo $0

  2. 원격으로 수동으로 ssh를 실행하고 qlogin 경로를 인쇄할 때(passed which qlogin) 알겠어요

/opt/ge/bin/lx-amd64/qlogin

그러나 스크립트를 통해 동일한 작업을 수행하면 정보가 표시되지 않습니다. 이는 qlogin이 아직 설치되지 않았음을 의미합니다.

  1. 마지막으로, 내가 스크립트를 실행한 사용자는 수동으로 ssh에 로그인한 사용자와 달랐습니다(printing을 통해 얻었습니다 who).

어떻게 해야 합니까?

답변1

이 경우 원하는 것은 다음과 같습니다.

ssh XYZ "qlogin -l cuda=1"

또는

ssh XYZ "export TERM=xterm ; qlogin -l cuda=1"

TERM변수가 설정되지 않았다는 오류가 발생하는 경우 또는:

ssh XYZ << 'EOF'
qlogin -l cuda=1
EOF

실행할 명령이 여러 개인 경우.

마지막으로 위의 방법이 작동하지 않을 것이라고 확신하므로 이 방법도 작동할 것입니다.

ssh XYZ << 'EOF'
shopt -s expand_aliases
source .bashrc
qlogin -l cuda=1
EOF

아마도 눈치채셨겠지만, 다른 하나가 작동하지 않으면 마지막 하나가 작동할 수 있습니다. 주로 qlogin기본 내보낸 경로 중 하나에 있지 않은 경우 다음과 같습니다.

  • 별명어딘가에기타(예: 일부 원격 서버는 PATH로 내보내지지 않은 마운트된 NFS 폴더에 설치 스크립트를 보관하기를 원함)

  • 함수로 구성된 더 큰 함수/스크립트의 일부인 경우.

env의 출력을 보고 이를 결정할 수 alias있습니다 whereis. 예를 들어 .bashrc명령의 전체 경로를 언급할 수 있는 다른 내용 이나 생각나는 다른 내용 으로 바꾸십시오 .qlogin.profile

관련 정보