스크립트에서 다음과 같은 작업을 수행하고 싶습니다.
$ ssh host1 "$(command)"
그러나 다음을 수행하면 SSH 연결이 설정되기 전에 하위 프로세스가 실행됩니다.
$ ssh host1 "$(hostname)"
로컬 컴퓨터의 호스트 이름을 반환합니다. 나는 내가 원하는 다른 일을 더 쉽게 할 수 있도록 하위 프로세스를 사용할 수 있기를 원합니다.
편집: 요청 시 더 완전한 예를 제공할 수 있습니다. crontab 항목을 추가해야 하는 호스트 이름 목록이 있습니다. 각 시스템은 특정 사용자에게 속하므로 이름에 이 항목을 추가해야 합니다. 시스템 소유자는 시스템 호스트 이름에 포함되어 있으므로 호스트 이름을 확인하여 su
적절한 사용자를 찾고 그에 따라 crontab을 편집할 수 있습니다. 예를 들어 다음과 같습니다.
for host in $(cat /tmp/hosts); do
echo -e "----------------------------"
echo -e "# SSH to host $host"
echo -e "----------------------------"
ssh $host "su - $(hostname | cut -b-5-); crontab -e";
done
답변1
큰따옴표를 사용하면 쉘이 확장될 수 있으므로 명령 대체가 기본적으로 확장됩니다.
큰따옴표를 사용하면 쉘이 $
, `
, \
및 히스토리 확장이 활성화된 경우 해석할 수 있습니다.!
반면에 작은따옴표는 모든 특수 문자를 리터럴로 유지합니다.
따라서 명령 대체를 작은따옴표로 묶으면 해당 명령이 그대로 원격 시스템에 전달되도록 할 수 있습니다. 명령 대체의 일부로 로컬 변수를 유지해야 하는 경우 이스케이프 문자를 사용할 수도 있습니다.
ssh user@host "$(command)" #will expand locally
ssh user@host '$(command)' #will expand on the remote machine
ssh user@host "\$(command $local_var)" #will expand local_var locally but send the command substitution to the remote machine