원격 컴퓨터의 mysql 덤프를 로컬 파일로 저장해야 하므로 ssh
원격 컴퓨터에 연결하여 mysqldump
원격 컴퓨터에서 스크립트를 실행하고 로컬 파일에 저장합니다.
bash 스크립트 2개와 구성 파일 1개가 있습니다 function.sh
.export-db.sh
export-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
같지만정말거기 가고 싶지 않아요. )