원격 컴퓨터에서 쉘 스크립트 (windows / Linux)를 실행해야합니다.
머신 A와 B 모두에 SSH가 구성되어 있습니다. 스크립트는 머신 A에 있으며 원격 머신 머신 B에서 일부 코드를 실행합니다.
로컬 및 원격 컴퓨터는 Windows 또는 Unix 기반 시스템 일 수 있습니다.
plink / ssh를 사용하여 실행할 수있는 방법이 있습니까?
원격 컴퓨터에서 쉘 스크립트 (windows / Linux)를 실행해야합니다.
머신 A와 B 모두에 SSH가 구성되어 있습니다. 스크립트는 머신 A에 있으며 원격 머신 머신 B에서 일부 코드를 실행합니다.
로컬 및 원격 컴퓨터는 Windows 또는 Unix 기반 시스템 일 수 있습니다.
plink / ssh를 사용하여 실행할 수있는 방법이 있습니까?
답변:
기계 A가 Windows 상자 인 경우, -m 매개 변수와 함께 Plink ( PuTTY의 일부)를 사용할 수 있으며 원격 서버에서 로컬 스크립트를 실행합니다.
plink root@MachineB -m local_script.sh
머신 A가 유닉스 기반 시스템 인 경우 다음을 사용할 수 있습니다.
ssh root@MachineB 'bash -s' < local_script.sh
스크립트를 실행하기 위해 스크립트를 원격 서버에 복사 할 필요는 없습니다.
sudo
실행하십시오 ssh root@MachineB 'echo "rootpass" | sudo -Sv && bash -s' < local_script.sh
.
HISTCONTROL=ignoreboth or ignorespace
작동
ssh root@MachineB ARG1="arg1" ARG2="arg2" 'bash -s' < local_script.sh
크레딧은 아래 @chubbsondubs의 답변으로 완전히 이동하십시오.
이것은 오래된 질문이며 Jason의 대답은 잘 작동하지만 이것을 추가하고 싶습니다.
ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH
su 및 사용자 입력이 필요한 명령과 함께 사용할 수도 있습니다. ( '
탈출 된 heredoc 참고 )
편집 :이 답변은 약간의 트래픽을 계속 받고 있기 때문에 heredoc의 멋진 사용법에 더 많은 정보를 추가 할 것입니다.
이 구문으로 명령을 중첩 할 수 있으며 중첩이 작동하는 유일한 방법은 (정상적인 방법으로)
ssh user@host <<'ENDSSH'
#commands to run on remote host
ssh user@host2 <<'END2'
# Another bunch of commands on another host
wall <<'ENDWALL'
Error: Out of cheese
ENDWALL
ftp ftp.secureftp-test.com <<'ENDFTP'
test
test
ls
ENDFTP
END2
ENDSSH
실제로 telnet, ftp 등과 같은 일부 서비스와 대화를 할 수 있습니다. 그러나 heredoc은 stdin을 텍스트로 보내므로 줄 사이의 응답을 기다리지 않습니다.
편집 : 방금 탭 을 사용하면 내부를 들여 쓸 수 있음을 알았습니다 <<-END
!
ssh user@host <<-'ENDSSH'
#commands to run on remote host
ssh user@host2 <<-'END2'
# Another bunch of commands on another host
wall <<-'ENDWALL'
Error: Out of cheese
ENDWALL
ftp ftp.secureftp-test.com <<-'ENDFTP'
test
test
ls
ENDFTP
END2
ENDSSH
(이것이 효과가 있다고 생각합니다)
<<'ENDSSH'
) 주위에 작은 따옴표를 사용하면 문자열이 확장되지 않고 변수가 평가되지 않습니다. <<ENDSSH
또는 <<"ENDSSH"
확장을 원하는 경우 에도 사용할 수 있습니다 .
Expect
FTP와 같은 대화식 명령을 자동화해야 할 때 사용할 수 있습니다.
Pseudo-terminal will not be allocated because stdin is not a terminal.
메시지를 받았음을 주목하십시오 . -t -t
그것을 피하기 위해 ssh를 params 와 함께 사용해야 합니다.
또한 대상 호스트에서 변수를 선택하려면 이스케이프하는 것을 잊지 마십시오.
이것은 과거에 나를 잡아 냈습니다.
예를 들면 다음과 같습니다.
user@host> ssh user2@host2 "echo \$HOME"
/ home / user2를 출력합니다
동안
user@host> ssh user2@host2 "echo $HOME"
/ home / user를 출력합니다
또 다른 예:
user@host> ssh user2@host2 "echo hello world | awk '{print \$1}'"
"hello"를 올바르게 인쇄합니다.
ssh user2@host 'bash -s' echo $HOME /home/user2 exit
for
로 실행 루프 ssh
세션 루프 변수가 탈출하지 않아야합니다.
ssh user2@host2 'echo hello world' | awk '{ print $1 }'
은 Awk 스크립트를 로컬에서 실행하는 것 입니다. 원격 명령이 엄청난 양의 출력을 생성하는 경우 로컬 서버로 다시 복사하지 않도록하려고합니다. 또한 원격 명령 주위의 작은 따옴표는 이스케이프 처리를 피합니다.
이것은 인라인 원격 명령과 로컬 시스템에서 원격 호스트로 ENV 변수를 전달하여 원격 측에서 스크립트를 매개 변수화 할 수있는 YarekT의 답변을 확장 한 것입니다.
ssh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'
# commands to run on remote host
echo $ARG1 $ARG2
ENDSSH
이 스크립트는 모두 하나의 스크립트로 작성하여 매우 읽기 쉽고 유지 관리가 가능하므로 매우 유용합니다.
왜 이것이 효과가 있습니까? ssh는 다음 구문을 지원합니다.
ssh user @ host remote_command
bash에서는 다음과 같이 한 줄에서 명령을 실행하기 전에 정의 할 환경 변수를 지정할 수 있습니다.
ENV_VAR_1 = 'value1'ENV_VAR_2 = 'value2'bash -c 'echo $ ENV_VAR_1 $ ENV_VAR_2'
따라서 명령을 실행하기 전에 변수를 쉽게 정의 할 수 있습니다. 이 경우 echo는 우리가 실행하는 명령입니다. echo 전의 모든 것은 환경 변수를 정의합니다.
그래서 우리는 두 가지 기능과 YarekT의 대답을 결합하여 얻었습니다.
ssh user @ host ARG1 = $ ARG1 ARG2 = $ ARG2 'bash -s'<< 'ENDSSH'...
이 경우 ARG1 및 ARG2를 로컬 값으로 설정합니다. user @ host 이후에 remote_command로 모든 것을 보냅니다. 원격 시스템에서 ARG1 및 ARG2 명령이 실행될 때 원격 서버의 환경 변수를 정의하는 로컬 명령 행 평가 덕분에 로컬 값이 설정되고 해당 변수를 사용하여 bash -s 명령이 실행됩니다. 짜잔
ssh user@host "ARG1=\"$ARG1\" ARG2=\"$ARG2\"" 'bash -s' <<'ENDSSH'...
-s
stdin을 통해 제공되는 스크립트에 인수를 적용 할 수 있다는 것입니다. 당신이 그것을 사용하지 않을 경우 당신은 그것을 생략 할 수 있습니다. 사용하면 환경 변수를 사용할 이유가 없습니다.ssh user@host 'bash -s value1 value2' <<< 'echo "$@"'
<hostA_shell_prompt>$ ssh user@hostB "ls -la"
hostA 사용자의 공개 키를 user .ssh 디렉토리의 홈에있는 authorized_keys 파일에 복사하지 않은 경우 비밀번호를 묻는 메시지가 표시됩니다. 이를 통해 비밀번호없는 인증이 가능합니다 (ssh 서버 구성에서 인증 방법으로 승인 된 경우).
보다 정교한 작업을 위해 Fabric 을 사용하기 시작했습니다 . Fabric에는 Python과 몇 가지 다른 종속성이 필요하지만 클라이언트 시스템에만 필요합니다. 서버는 ssh 서버이면됩니다. 이 도구는 SSH로 전달한 쉘 스크립트보다 훨씬 강력하며 설정에 어려움이 있습니다 (특히 Python에서 프로그래밍을 즐기는 경우). Fabric은 여러 호스트 (또는 특정 역할의 호스트)에서 스크립트 실행을 처리하고, 구성 스크립트에 줄을 추가하는 등의 dem 등식 작업을 용이하게하는데 도움을줍니다. 언어는 제공 할 수 있습니다).
실행 해보십시오 ssh user@remote sh ./script.unx
.
"원격"시스템에 수동으로 로그인하지 않고 "로컬"시스템에서이 작업을 자동으로 수행한다고 가정하면 Expect라고하는 TCL 확장을 살펴보아야합니다. 이러한 상황에 맞게 정확하게 설계되었습니다. 또한 SSH를 통한 로그인 / 상호 작용을위한 스크립트 링크를 제공했습니다.
여기에 대한 답은 ( https://stackoverflow.com/a/2732991/4752883 사용하여 원격 리눅스 컴퓨터에서 스크립트를 실행하려고하는 경우) 좋은 작품 plink
이나 ssh
. 스크립트에 여러 줄이 있으면 작동합니다 linux
.
** 그러나 로컬 linux/windows
컴퓨터 에있는 배치 스크립트를 실행하려고 시도하고
원격 컴퓨터가 Windows
이고 **를 사용하는 여러 줄로 구성된 경우
plink root@MachineB -m local_script.bat
작동하지 않습니다.
스크립트의 첫 번째 줄만 실행됩니다. 이것은 아마도 한계입니다 plink
.
여러 줄 배치 스크립트를 실행하려면 (특히 비교적 간단한 경우 몇 줄로 구성) :
원래 배치 스크립트가 다음과 같은 경우
cd C:\Users\ipython_user\Desktop
python filename.py
local_script.bat
파일 에서 다음과 같이 "&&"구분 기호를 사용하여 행을 결합 할 수 있습니다
.
https://stackoverflow.com/a/8055390/4752883 :
cd C:\Users\ipython_user\Desktop && python filename.py
이 변경 후에는 @ JasonR.Coombs가 https://stackoverflow.com/a/2732991/4752883 에서 지적한대로 스크립트를 실행할 수 있습니다 .
`plink root@MachineB -m local_script.bat`
배치 스크립트가 비교적 복잡한 경우 여기에서 @Martin https://stackoverflow.com/a/32196999/4752883 에서 지적한 것처럼 plink 명령을 캡슐화하는 배치 스크립트를 사용하는 것이 좋습니다 .
rem Open tunnel in the background
start plink.exe -ssh [username]@[hostname] -L 3307:127.0.0.1:3306 -i "[SSH
key]" -N
rem Wait a second to let Plink establish the tunnel
timeout /t 1
rem Run the task using the tunnel
"C:\Program Files\R\R-3.2.1\bin\x64\R.exe" CMD BATCH qidash.R
rem Kill the tunnel
taskkill /im plink.exe
이 bash는 스크립트를 실행하기 전에 미리 설치하는 것을 잊지 마세요, 대상 원격 컴퓨터에 SSH를 수행하고 원격 시스템에서 몇 가지 명령을 실행 (Mac에서 brew install expect
)
#!/usr/bin/expect
set username "enterusenamehere"
set password "enterpasswordhere"
set hosts "enteripaddressofhosthere"
spawn ssh $username@$hosts
expect "$username@$hosts's password:"
send -- "$password\n"
expect "$"
send -- "somecommand on target remote machine here\n"
sleep 5
expect "$"
send -- "exit\n"
runoverssh 를 사용할 수 있습니다 :
sudo apt install runoverssh
runoverssh -s localscript.sh user host1 host2 host3...
-s
로컬 스크립트를 원격으로 실행
유용한 플래그 :
-g
모든 호스트에 글로벌 비밀번호 사용 (단일 비밀번호 프롬프트)
-n
공개 키 인증에 유용한 sshpass 대신 SSH 사용
먼저 scp를 사용하여 스크립트를 머신 B로 복사하십시오.
[user @ machineA] $ scp / path / to / script user @ machineB : / home / user / path
그런 다음 스크립트를 실행하십시오.
[user @ machineA] $ ssh user @ machineB "/ home / user / path / script"
스크립트에 실행 권한을 부여한 경우 작동합니다.