
次のスクリプトは、root
oumaimaのコンピュータに2つのディレクトリを共有するためにjimのコンピュータで実行されます。
#!/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
/root/syncing-w-.log
次の内容でリモートホストにログファイルを生成します。
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.
au
などの変数は(マイコンピュータの管理者ユーザー)とディレクトリ名d
には拡張されません。jim
その結果、longが代わり/root/syncing-w-.log
に作成されました/root/syncing-w-jim.log
。また、ログの内容はコピーされたディレクトリに固有ではありませんrsync
。一重引用符が原因であるようですが、'echo -e "${d} synced, $(date)."|tee -a "/root/syncing-w-${au}.log"'
変数が拡張されるようにどのように書き換えることができますか?
答え1
特定の質問に答える
一重引用符内の内容は拡張されません。したがって、二重引用符を使用する必要があります。一度展開すると再度拡張したくないので、一重引用符と二重引用符を置き換える必要があるかもしれません。
"echo -e '${d} synced, $(date).'|tee -a '/root/syncing-w-${au}.log'"
これにより、コンピュータで date コマンドが実行され、コンピュータで d と au が展開され、次の内容が渡されます。
echo -e '/var/lib/transmission synced, Fri 8 Dec 2023 23:45.'|tee -a '/root/syncing-w-jim.log'
実行するリモートコンピュータに。
さまざまな方法
ローカルタスクはローカルで行い、リモートタスクはリモートで行ってください!
echo -e "${d} synced, $(date)." | ssh -i "/home/${au}/.ssh/id_rsa" -t -6 "root@${her_host}" tee -a "/root/syncing-w-${au}.log"
端末でエコーを行い、リモコンでティーを出すことができます。
一般的な質問に答える
コマンドラインを介してリモートコンピュータで複雑なコマンドを実行しないようにする必要があります。リモートコンピュータに保存されているシェルスクリプトを作成して実行します。