![SSH, for 루프 및 파일 터치를 동시에 수행할 수 있나요?](https://linux55.com/image/21211/SSH%2C%20for%20%EB%A3%A8%ED%94%84%20%EB%B0%8F%20%ED%8C%8C%EC%9D%BC%20%ED%84%B0%EC%B9%98%EB%A5%BC%20%EB%8F%99%EC%8B%9C%EC%97%90%20%EC%88%98%ED%96%89%ED%95%A0%20%EC%88%98%20%EC%9E%88%EB%82%98%EC%9A%94%3F.png)
for account in ${accounts}
do
`ssh -q id@server "touch EVENTS_${account}_${date}.log"`
done
여러 번 SSH를 실행하는 대신 SSH를 통해 for 루프를 실행하고 파일을 터치할 수 있나요?
답변1
ssh를 사용하면 여러 명령을 실행할 수 있습니다. 각 명령을 세미콜론으로 구분하면 됩니다.
command=": "
for account in ${accounts}
do
command=$command"; touch EVENTS_${account}_${date}.log"
done
ssh -q id@server "$command"
모든 ":"은 "다음 명령을 계속합니다"를 의미합니다. 이렇게 하면 명령이 세미콜론으로 시작되지 않습니다.
또한 명령 주위에 백틱을 사용할 필요가 없습니다.
답변2
원격 컴퓨터에서 루프를 실행합니다.
ssh -q id@server "for account in ${accounts}; do touch EVENTS_\${account}_${date}.log; done"
$accounts
에는 $date
쉘 특수 문자( )가 포함되어 있지 않다고 가정합니다 "$'()&;<>[\]`{|}~
. 특히 $accounts
원격 셸에 삽입된 다음 거기서 해석됩니다. 특수 문자를 보호해야 하는 경우 인용에 더욱 주의해야 합니다.
q=\'\\\'\' # '\'' effectively quotes a single quote inside single quotes
ssh -q id@server 'for account in '\'"${accounts//\'/$q}"\''; do touch "EVENTS_${account}_${date}.log"; done'
또는 다음 명령을 사용하여 원격 파일 시스템을 마운트합니다.sshfs마치 현지인처럼 운영됩니다.
mkdir mnt
sshfs id@server mnt
for account in ${accounts}; do touch "mnt/EVENTS_\${account}_${date}.log"; done
답변3
클러스터sh당신이 하고 싶은 일을 위한 완벽한 도구인 것 같습니다.
ClusterSSH는 동시에 여러 서버에서 동일한 변경을 수행할 수 있는 도구입니다. "cssh" 명령은 지정된 모든 호스트의 관리 콘솔과 xterm을 엽니다. 관리 콘솔에 입력된 모든 텍스트는 모든 창에 복사됩니다. 모든 창에서는 직접 입력도 가능합니다.
이 도구는 클러스터 내의 모든 노드에서 동일한 구성이나 명령을 실행해야 하는 클러스터 관리에 적합하지만 이에 국한되지는 않습니다. 이 도구를 통해 이러한 명령을 한 번 실행하면 모든 노드가 동기화된 상태로 유지됩니다.