2017-05-03 2 views
0

root가 소유 한 기존 파일에 행을 추가하려고하는데 약 100 개의 서버로이 작업을 수행해야합니다. 그래서 모든 IP와 ntp.txt 파일을 첨부하여 추가해야하는 행이있는 servers.txt 파일을 만들었습니다. 나는 다음 스크립트를 실행하고 있으며 나는 내가하려고하는 것을 성취하지 못하고있다. 누군가가 시정해야 할 부분을 제안 할 수 있습니까?sudo로 파일에 추가하기

!/bin/bash 
servers=`cat servers.txt`; 
for i in $servers; 
do 
    cat ntp.txt | ssh [email protected]${i} sudo sh -c "cat >>ntp.conf"" 
done 
+1

root로 이미 로그인 한 경우 왜 sudo를 사용해야합니까? – user2141130

+1

루트의 홈 디렉토리에있는'ntp.conf'에 추가 하시겠습니까? 아니면'/ etc/ntp.conf'에 추가 하시겠습니까? –

+0

파일 경로 외에도 괜찮아 보입니다. 'ssh root @ $ i "cat >> /path/to/ntp.conf" ilkkachu

답변

1

다음은 몇 가지 문제입니다. 내가 그들 모두를 발견했는지 확신 할 수 없다.

  1. shebang 라인에는 중요하고 중요한 #이 없습니다.
  2. 서버 이름을 변수로 읽어 들일 필요가 없으며 메모리를 낭비하는 것 외에 여러 가지 잠재적 인 문제에 노출되어 있습니다. https://mywiki.wooledge.org/DontReadLinesWithFor
  3. Unless you specifically require the shell to do whitespace tokenization and wildcard expansion on a value, 큰 따옴표 (또는 작은 따옴표로 묶어도되지만 이것은 여전히 ​​원하는 변수 확장을 금지합니다)를 참조하십시오.
  4. root으로 로그인하는 경우 명시 적으로 sudo을 입력 할 필요가 없습니다.
  5. ssh 쉘을 실행합니다. 명시 적으로 sh -c 명령을 할 필요가 없습니다.
  6. 가능한 경우 루트 셸을 실행하지 않으려합니다. 리디렉션 할 수 있도록 쉘을 생성하지 않고도 파일에 추가하는 일반적인 방법은 을 추가하여 추가하는 대신 겹쳐 쓰려면 tee -a을 사용하는 것입니다. 또한 파일을 표준 출력으로 인쇄하는 것은 바람직하지 않은 결과입니다 (일부는 부작용이 아니라 tee이지만 주저하지 말자). 따라서 텍스트가 화면에 쏟아지는 것을 피하려면 /dev/null으로 리디렉션하는 것이 좋습니다.
  7. useless use of cat을 피하려면 누군가가 너에게 쓸모 없다는 것을 피하려면.
    #!/bin/bash 
    while read -r server; do 
    do 
        ssh [email protected]"$server" sudo tee -a /etc/ntp.conf <ntp.txt >/dev/null 
    done <servers.txt 
    

나는 you로 로그인 코드를 변경 그러나 당신이 당신의 환경에 맞게 적용해야합니다 물론 뭔가입니다. (당신이 스스로로 로그인하면 대개 ssh server 명시 적으로 사용자 이름을 지정. 없음) 의견으로 당

, 나는 또한 대상 파일 /etc/ntp.conf

서버에 더 훈련 방법에 대한 전체 경로를 추가 구성은 CFengine2와 같은 것을 사용하여 구성을 관리하는 것입니다.