txt 파일에서 명령 실행

txt 파일에서 명령 실행

파일이 있고 이 파일에는 다음 줄이 있습니다.

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.comserver1.comssh [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. 이 습관을 길러라변수 대체 주위에 큰따옴표 추가.

    더 나은 서비스를 받으실 수 있습니다여러 컴퓨터에서 동일한 명령을 실행하기 위한 프레임워크.

관련 정보