for 루프의 변수를 사용하여 원격 명령 실행

for 루프의 변수를 사용하여 원격 명령 실행

사용자를 추가해야 하는 약 100개의 서버 목록이 있습니다. 인증된 키 파일에도 추가해야 하는 ssh-rsa 키가 있습니다. 이 작업을 수행하기 위해 for 루프를 사용하려고 하는데 아무런 진전이 없습니다.

요새(연결)에 SSH에 대한 별칭을 사용하고 있으며 서버에 연결할 수 있지만 프롬프트에서 중지된 다음 해당 프롬프트에서 종료를 입력할 때까지 계속되지 않습니다. 그럼에도 불구하고 실제로는 원격이 아닌 로컬에서 명령을 실행하는 것 뿐이라고 생각합니다.

타사 도구를 사용할 수 없으므로 기본 설치에 제공된 도구를 사용해야 합니다.

#!/bin/bash

connect='ssh user@bastionserver -t --'
adduser='adduser  -disabled-password  --gecos "a user account" -home /home/foobar foobar -q'
mkdir='mkdir /home/foobar/.ssh'
chmod='chmod -R 700 /home/foobar/.ssh/'
chown='chown -R soc /home/foobar/'

for server in $(cat server_list.txt)
do
    $connect root@"$server"
    echo "$adduser"
    echo "$mkdir"
    echo "$chmod"
    echo "$chown"
done

나는 이것을 알아낼 수 없다! 도움을 주시면 감사하겠습니다.

답변1

ssh명령은 원격 서버에서 명령을 실행할 수 있습니다. 실행 명령이 주어지지 않으면 대화형 쉘이 시작됩니다. ssh실행하려는 명령을 실행 하는 데 사용됩니다 . 예를 들어:

#!/bin/sh

while read server; do
    ssh "user@$server" sh -c '
        adduser  -disabled-password  --gecos "a user account" -home /home/foobar foobar -q
        mkdir /home/foobar/.ssh
        chmod -R 700 /home/foobar/.ssh/
        chown -R soc /home/foobar/'
done <server_list.txt

이것은 분명히 테스트되지 않은 코드입니다. 여러 명령을 실행할 수 있도록 하위 쉘을 시작 sh -c하고 실행할 명령 목록을 쉘에 제공합니다.

귀하의 명령은 서버에 연결되고(실제로 연결되지만 user@bastionserver입력 파일에 나열된 서버와 어떻게 관련되는지는 모르겠습니다) 대화형 쉘을 시작하기 때문에 "중지"됩니다. 대화형 셸이 종료될 때까지 스크립트는 계속되지 않습니다.

나머지 코드는 문자열을 터미널에 출력합니다. 이를 시행하지 않습니다.

명령을 변수에 넣으려고 하지 마세요. 예상대로 작동하는 경우는 거의 없습니다. 예를 들어 "변수에 저장된 명령을 어떻게 실행할 수 있나요?".


이것이 나에게 실제 업무라면 다음과 같은 방법을 사용하여 수행하려고 할 것입니다.안시푸르. 불행하게도 저는 여기서 완전한 솔루션을 자신있게 제공할 만큼 Ansible을 잘 알지 못합니다.

관련 정보