O script a seguir é executado por root
e tem como objetivo compartilhar dois diretórios do computador de Jim com o de Oumaima.
#!/usr/bin/bash
au=$(echo "$(head -n 1 /etc/doas.conf)"|sed 's/permit//;s/as//;s/root//;s/ //g')
dirs=(
"/var/lib/transmission-daemon/downloads"
"/home/${au}/VisualArts/films_FR"
)
dst_ip="[fe80::cc08:9467:8dba:15a9%wlp4s0]"
her_host="fe80::cc08:9467:8dba:15a9%wlp4s0"
give_oumaima() {
for d in ${dirs[@]}; do
rsync -e "ssh -6 -i /home/${au}/.ssh/id_rsa" -av --delete --no-o --no-g --chown=oumaima:oumaima "${d}" "root@${dst_ip}:/home/oumaima/Desktop" &&
ssh -i "/home/${au}/.ssh/id_rsa" -t -6 "root@${her_host}" 'echo -e "${d} synced, $(date)."|tee -a "/root/syncing-w-${au}.log"'
done
}
give_oumamima
O arquivo de log, /root/syncing-w-.log
é criado no host remoto e seu conteúdo é:
synced, Fri Dec 8 20:05:15 CET 2023.
synced, Fri Dec 8 20:52:57 CET 2023.
synced, Fri Dec 8 20:52:58 CET 2023.
synced, Fri Dec 8 21:01:37 CET 2023.
As variáveis como au
e d
não se expandem para jim
(o usuário administrador do meu PC) e o nome do diretório. Isso faz com que seja criado por muito tempo como /root/syncing-w-.log
em vez de /root/syncing-w-jim.log
. Além disso, o conteúdo do log não é específico em relação ao diretório que está sendo copiado pelo rsync
. Parece que as aspas simples são as culpadas, mas como posso reescrever 'echo -e "${d} synced, $(date)."|tee -a "/root/syncing-w-${au}.log"'
para que as variáveis se expandam?
Respondendo à pergunta específica
Coisas entre aspas simples não são expandidas. Então você precisa usar aspas duplas. Depois que elas forem expandidas, você não deseja que elas sejam expandidas uma segunda vez, então você provavelmente desejará trocar as aspas simples e duplas para obter
que executará o comando date no seu computador, expandirá d e au no seu computador e passará algo como
para o computador remoto para ser executado.
Uma abordagem diferente
Faça coisas locais localmente e coisas remotas remotamente!
Você pode fazer o eco na sua máquina e o tee no controle remoto.
Respondendo à pergunta geral
Você deve tentar evitar a execução de comandos complicados na máquina remota por meio da linha de comando. Escreva um script de shell armazenado na máquina remota e execute-o.