Bash, 명령은 기능으로 작동하지 않지만 수동은 작동합니다.

Bash, 명령은 기능으로 작동하지 않지만 수동은 작동합니다.

원격 컴퓨터의 mysql 덤프를 로컬 파일로 저장해야 하므로 ssh원격 컴퓨터에 연결하여 mysqldump원격 컴퓨터에서 스크립트를 실행하고 로컬 파일에 저장합니다.

bash 스크립트 2개와 구성 파일 1개가 있습니다 function.sh.export-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같지만정말거기 가고 싶지 않아요. )

관련 정보