Bash、コマンドは機能として機能しませんが、手動は機能します。

Bash、コマンドは機能として機能しませんが、手動は機能します。

リモートコンピュータのmysqlダンプをローカルファイルとして保存する必要があるため、リモートコンピュータにssh接続してリモートmysqldumpコンピュータでスクリプトを実行し、ローカルファイルに保存します。

2つのbashスクリプトと1つの設定ファイルがありますfunction.shexport-db.shexport-db-ssc.cfg

文書function.sh

#!/bin/bash

cd "$(dirname "${BASH_SOURCE[0]}")"

date_time="$(date "+%Y%m%d-%H%M%S")"
date_time_now="date +%Y%m%d-%H%M%S"
file_name="$(basename "$0")"
file_log="log/${file_name%.*}.log"
email_sender='[email protected]'
email_recipients='[email protected]'

message()
{
    if [ $1 = "i" ]
    then
        echo "`$date_time_now`|sofimon|"$file_name"|$2|info." 2>&1 | tee -a "$file_log"
    elif [ $1 = "t" ]
    then
        echo "`$date_time_now`|sofimon|"$file_name"|$2|true." 2>&1 | tee -a "$file_log"
    else [ $1 = "f" ]
        echo "`$date_time_now`|sofimon|"$file_name"|$2|false!" 2>&1 | tee -a "$file_log"
    fi
}

# $1 = description, $2 = command, $3 = command if $2 is true, $4 = command if $2 is false
doit()
{
    if
        $2
    then
        message "t" "$1"
        "$3"
    else
        message "f" "$1"
        result="false"
        "$4"
    fi
}

email()
{
cat "$file_log" | mail -a "From: sofimon <$email_sender>" -a "Content-type: text/plain" -s "sofimon" -r $email_sender $email_recipients
mv "$file_log" "$file_log"-"$date_time"
rm -rf "$file_log"
}

# Check if run file exists, if so, then exit
if [ -f "$file_log" ]
then
    exit 1
fi

> "$file_log"

文書export-db.sh

#!/bin/bash

source function.sh

folder_export="/mnt/export"
username="sofimon"
divider=";"

# Read config file, variables as var divided by ;
while IFS=$divider read -ra var; do

    command_mkdir="mkdir -p "$folder_export"/"${var[0]}""
    command_mysqldump="sudo mysqldump -uroot -p"${var[1]}" --max_allowed_packet=2147483648 --host=localhost --quote-names --ignore-table=mysql.event --opt --all-databases"
    command_ssh="ssh -i id_rsa_sofimon -n "$username"@"${var[0]}" "$command_mysqldump" > "$folder_export"/"${var[0]}"/"$date_time"-"${var[0]}".mysql"


# Check commands
    echo $command_mkdir
    echo $command_ssh

# Run commands
    doit "create export folder "${var[0]}"" "$command_mkdir"
    doit "dump database from "${var[0]}"" "$command_ssh"

done <<< $(cat "${file_name%.*}"-$1.cfg | grep -v "#")

email

文書export-db-ssc.cfg

# host;password
ssc-osw-web;PASSWORD

私が走るとき

./export-db.sh ssc

それは私にそれを示しました。

hosek@osw-backup:~/sofimon$ ./export-db.sh ssc
mkdir -p /mnt/export/ssc-osw-web
ssh -n sofimon@ssc-osw-web sudo mysqldump -uroot -pPASSWORD --max_allowed_packet=2147483648 --host=localhost --quote-names --ignore-table=mysql.event --opt --all-databases > /mnt/export/ssc-osw-web/20200221-110536-ssc-osw-web.mysqldump
20200221-110536|sofimon|export-db.sh|create export folder ssc-osw-web|true.
bash: /mnt/export/ssc-osw-web/20200221-110536-ssc-osw-web.mysqldump: No such file or directory
20200221-110538|sofimon|export-db.sh|dump database from ssc-osw-web|false!

だからcommand_mkdir大丈夫ですがcommand_ssh動作しません。

なぜ間違っているのですNo such file or directoryか?

$command_ssh端末で手動でコマンドを実行すると正常に動作します。

ssh -n sofimon@ssc-osw-web sudo mysqldump -uroot -pPASSWORD --max_allowed_packet=2147483648 --host=localhost --quote-names --ignore-table=mysql.event --opt --all-databases > /mnt/export/ssc-osw-web/20200221-110536-ssc-osw-web.mysqldump

この結果を得るには、スクリプトを修正してみてくださいecho $command_ssh

ssh -n sofimon@ssc-osw-web "sudo mysqldump -uroot -pPASSWORD --max_allowed_packet=2147483648 --host=localhost --quote-names --ignore-table=mysql.event --opt --all-databases" > /mnt/export/ssc-osw-web/20200221-110536-ssc-osw-web.mysqldump

同じエラーです。

ありがとうございます。

修正する

機能を備えた新しいコード。

#!/bin/bash

cd "$(dirname "${BASH_SOURCE[0]}")"

date_time="$(date "+%Y%m%d-%H%M%S")"
now="date +%Y%m%d-%H%M%S"
module="$1"
config="$2"
log="log/${module%.*}.log"
email_sender='[email protected]'
email_recipients='[email protected]'
#email_recipients='[email protected] [email protected]'


# Declare functions

message()
{
if [ $1 = "i" ]
then
echo "`$now`|sofimon|"$module"|"$config"|$2|info." 2>&1 | tee -a "$log"
elif [ $1 = "t" ]
then
echo "`$now`|sofimon|"$module"|"$config"|$2|true." 2>&1 | tee -a "$log"
else [ $1 = "f" ]
echo "`$now`|sofimon|"$module"|"$config"|$2|false!" 2>&1 | tee -a "$log"
fi
}

doit()
{
#message "i" "$1"
if
"$1"
then
message "t" "$1"
else
message "f" "$1"
result="false"
fi
#message "i" "$1"
}

email()
{
cat "$log" | mail -a "From: sofimon <$email_sender>" -a "Content-type: text/plain" -s "sofimon" -r $email_sender $email_recipients
}

# Declare module functions

export_db()
{
folder_export="/mnt/export"
username="sofimon"
mkdir -p "$folder_export"/"${var[0]}"
ssh -i id_rsa_sofimon -n "$username"@"${var[0]}" "sudo mysqldump -uroot -p"${var[1]}" --max_allowed_packet=2147483648 --host=localhost --quote-names --ignore-table=mysql.event --opt --all-databases" > "$folder_export"/"${var[0]}"/"$date_time"-"${var[0]}".mysql
}

# Check if run file exists, if so, then exit

if [ -f "$log" ]
then
message "f" "script is still runnning"
exit 1
else
> "$log"
fi

# Read config file, variables as var divided by ' '

while IFS=' ' read -ra var; do
doit "$module"
done <<< $(cat "${module%.*}"-"$config".cfg | grep -v "#")
#email
mv "$log" "$log"_"$date_time"
rm -rf "$log"

しかし、これはこれを返します。

hosek@osw-backup:~/sofimon$ ./sofimon.sh export-db ssc
./sofimon.sh: line 34: export-db: command not found
20200224-133436|sofimon|export-db|ssc|export-db|false!
hosek@osw-backup:~/sofimon$ 

export-db関数が宣言された場合、その理由は何ですか?

ベストアンサー1

/mnt/export/ssc-osw-web/20200221-110536-ssc-osw-web.mysqldumpローカルシステムにインクルードディレクトリを作成している間、コマンド文字列のリダイレクトがリモートシステムに適用されているため、この操作は失敗します。

*コマンド文字列を含む変数にリダイレクトを含めることはできないため、作成したコードを使用してこの問題を簡単に解決することはできません。

eval(*または経由で呼び出すことができるようですbash -cが、本当にそこに行きたくありません。 )

おすすめ記事