스크립트에서 이 작업을 수행하려고 합니다. 원격 호스트에서 몇 가지 명령을 실행해야 합니다. 현재 나는 이것을하고 있습니다 :
ssh root@host 'bash -s' < command1
ssh root@host 'bash -s' < command2
ssh root@host 'bash -s' < command3
하지만 이는 서버에 반복적으로 연결해야 하므로 명령 처리 사이에 많은 시간이 추가된다는 의미입니다. 나는 다음과 같은 것을 찾고 있습니다 :
varSession=$(ssh root@host 'bash -s')
varSeesion < command1
varSeesion < command2
varSeesion < command3
이번에도 스크립트를 통해 이러한 명령을 실행해야 합니다. 살펴봤지만 screen
스크립트에서 사용할 수 있는지 잘 모르겠습니다.
답변1
당신은 사용할 수 ControlMaster
있습니다ControlPersist
명령 종료 후에도 연결이 유지되도록 허용합니다.
와 함께 사용되는 경우
ControlMaster
초기 클라이언트 연결이 닫힌 후 기본 연결이 백그라운드에서 열려 있어야 함을 지정합니다(향후 클라이언트 연결을 대기). 로 설정하면no
기본 연결이 백그라운드에 배치되지 않고 초기 클라이언트 연결이 종료된 후 즉시 종료됩니다.yes
또는 로 설정하면0
기본 연결은 백그라운드에서 무기한으로 유지됩니다(ssh -O exit
" "와 같은 메커니즘에 의해 종료되거나 닫힐 때까지). 초 단위 시간으로 설정하거나 에 기록된 형식으로 설정된 경우sshd_config(5)
백그라운드 마스터 연결은 지정된 시간 동안 유휴 상태(연결된 클라이언트 없음)를 유지한 후 자동으로 종료됩니다.
따라서 첫 번째 SSH 명령은 연결을 위한 제어 파일을 설정하고 나머지 두 명령은 제어 파일을 통해 연결을 재사용합니다. 다음과 같은 것이 있어야 ~/.ssh/config
합니다:
Host host
User root
ControlMaster auto
ControlPath /tmp/ssh-control-%C
ControlPersist 30 # or some safe timeout
그리고 스크립트에는 다른 변경 사항이 필요하지 않습니다.
답변2
팁부터 시작해 보세요.유제StackOverflow 및 bash 사용여기 문서:
ssh root@host 'bash -s' << EOF
command1
command2
command3
EOF
답변3
스크립트를 사용할 수 있습니다 expect
. SSH 연결을 자동화하고 원격 시스템에서 명령을 실행할 수 있습니다.이 코드SSH 연결 자동화에 대한 영감이 있어야 합니다.
당신은 이와 같은 것을 찾고 있습니다. 다음 코드를 파일에 저장foo.expect
#login to the remote machine
spawn ssh username@hostname
expect "?assword" { send "yourpassword\r"}
#execute the required commands; following demonstration uses echo command
expect "$ " {send "echo The falcon has landed\r"}
expect "$ " {send "echo The falcons have landed\r"}
expect "$ " {send "echo Will the BFR? land? \r"}
#exit from the remote machine
expect "$ " {send "exit\r"}
다음과 같이 실행expect foo.expect
애플리케이션이 이 스크립트를 실행할 것으로 예상해야 합니다. 명령어로 설치 가능apt-get install expect
이 책기대 스크립트를 탐색하는 데 도움이 됩니다. 즐거운 스크립팅!
답변4
를 사용하여 모든 파일을 연결 cat
한 다음 ssh
.
cat command1 command2 command3 | ssh root@host 'bash -s'