他のシステムでリモートで実行したいbashスクリプトがあります。リモートシステムのユーザーにcronjobを追加するだけです。
私はローカルシステムで実行しています。
ssh root@remote_system 'bash -s < /home/user_name/test2.sh'
これはリモートシステムで実行されるスクリプトです。
#!/bin/bash
set -x
#valhost=$(hostname)
if [ -d /home/user/junk ]
then
touch /var/spool/cron/user_name
crontab -l -u user_name > /home/user_name/mycron
chmod +x /home/user_name/mycron
echo "0 0 * * * /bin/find /home/user_name \( -name '*' \) -mtime +45 -delete" >> /home/user_name/mycron
crontab -u user_name /home/user_name/mycron
elif [ -d /home/user_name/tmp ]
then
touch /var/spool/cron/user_name
crontab -l -u user_name > /home/user_name/mycron
chmod +x /home/user_name/mycron
echo "0 0 * * * /bin/find /home/user_name \( -name '*' \) -mtime +60 -delete" >> mycron
crontab -u user_name /home/user_name/mycron
else
echo "directory does not exist on" $HOSTNAME > /home/user_name/jbossjunk
fi
ディレクトリが存在することを確認し、特定のエントリをcrontabに入れます。実際のリモートシステムでスクリプトを実行すると、スクリプトが正しく実行されます。ただし、ローカルで実行すると、エコーは「mycron」ファイルに出力されません。複数の場所を検索しましたが、機能する構文が見つかりませんでした。私は良い結果が得られずにいくつかの構文変換を試しました。リモートでスクリプトを実行するために使用できる「echo」行の構文を知らせる人はいますか?
答え1
出力がどのように処理されるtee
か。tee
echo
if [ -d /home/user/junk ]
then
touch /var/spool/cron/user_name
crontab -l -u user_name > /home/user_name/mycron
chmod +x /home/user_name/mycron
tee /home/user_name/mycron <<-EOF &>/dev/null
0 0 * * * /bin/find /home/user_name \( -name '*' \) -mtime +45 -delete
EOF
crontab -u user_name /home/user_name/mycron
elif
heredoc
この例では、指定されたファイルを読み取りますtee
。コマンド&>/dev/null
のSTDOUTとSTDERRを/ dev / nullに送信しますが、指定されたファイルへの書き込みにはtee
影響しません。tee
答え2
7つの参照ステートメントがあります/home/user_name/mycron
(ただし、文字通りではないと仮定します)。 1つは単純な参照(つまり、絶対パス名ではなく相対パス名)です。スクリプトを実行すると/home/user_name/mycron
u
s
e
r
_
n
a
m
e
mycron
~から /home/user_name
、彼らは同じです。でスクリプトを実行すると、/root
このecho
ステートメントがに書き込まれます/root/mycron
。
PS:絶対にこれを行う必要はありませんchmod +x /home/user_name/mycron
。