파일이 있고 이 파일에는 다음 줄이 있습니다.
ssh [email protected]
ssh [email protected]
etc....
각 서버에서 실행하고 해당 파일의 각 서버에서 ls 명령을 실행하고 싶은 스크립트가 있습니다. 내가 지금 하고 있는 일은:
while read line;
do
$line
done < $1
작동하지만 첫 번째 행에 대해서는 그 이후에
stdin이 터미널이 아니기 때문에 의사 터미널은 할당되지 않습니다. 실수.
그래서 나는 뭔가를 놓치고 있다는 것을 알고 있지만 여기서는 약간 길을 잃었습니다.
답변1
파일에 명령 옵션을 추가합니다 -t
.ssh
ssh -t [email protected]
ssh -t [email protected]
etc....
에서 man ssh
:
-t Force pseudo-tty allocation. This can be used to execute arbi‐
trary screen-based programs on a remote machine, which can be
very useful, e.g. when implementing menu services. Multiple -t
options force tty allocation, even if ssh has no local tty.
여전히 오류가 발생하면 다음 -t
과 같은 다른 옵션을 추가하세요.
ssh -t -t [email protected]
답변2
표준 입력에서 명령을 읽고 에서 실행하는 명령을 실행 중입니다. 표준 입력이 입력 파일에 연결되어 있으므로 명령을 실행하고 있습니다.ssh [email protected]
server1.com
server1.com
ssh [email protected]
해당 명령을 실행하려면 어떻게든 코드를 처리 ls
해야 합니다 . ls
두 가지 현명한 선택이 있습니다:
임의의 명령을 실행하려면 전체 명령을 입력 파일에 넣으십시오.
ssh [email protected] ls ssh [email protected] ls
입력 파일은 쉘 스크립트입니다. 로 실행하거나 실행 가능하게 만들어 맨 위에
sh myscript
놓으십시오 .#!/bin/sh
여러 컴퓨터에서 동일한 명령을 실행하려면 입력 파일에 컴퓨터 이름만 포함하도록 만드세요.
[email protected] [email protected]
그런 다음 머신 이름을 읽고 각 머신에서 명령을 실행합니다.
while read target comment; do ssh "$target" ls </dev/null done <"$1"
리디렉션은
/dev/null
원격 명령이 컴퓨터 이름 목록이 포함된 파일에서 표준 입력을 읽으려고 시도하는 것을 방지하기 위한 것입니다. 목록 파일의 각 줄에는 서버 이름 뒤에 추가 단어가 포함될 수 있으며 해당 단어는 변수에 채워집니다comment
. 이 습관을 길러라변수 대체 주위에 큰따옴표 추가.더 나은 서비스를 받으실 수 있습니다여러 컴퓨터에서 동일한 명령을 실행하기 위한 프레임워크.