Confusão de ordem de script Bash em grande redirecionamento de saída

1

Eu tenho um script que executa uma consulta de banco de dados e redireciona o resultado para um arquivo csv e depois de usar o sftp para fazer o upload, o arquivo é removido assim:

FileName=' echo "report_$StartDate:$StopDate.csv" | sed 's/\ /_/g''

$DatabaseCommand "$Query" -f CSV | sed 's/"//g' > "$ReportDir/$FileName"

expect<<EOD
set timeout 3600
spawn sftp $USER@$HOST
expect "password:"
send "$PASSWORD\r"
expect "sftp>"
send "put $ReportDir/$FileName\r"
expect "sftp>"
send "bye\r"
EOD

rm -rf $ReportDir/$FileName

Eu sei que a última linha deve ser alterada para rm -f , mas eu estou querendo saber se existe alguma maneira que o bash poderia se misturar na linha FileName e ser capaz de executar o seguinte comando:

rm -rf $ReportDir/
    
por Mohammad Amin 19.12.2017 / 08:17

3 respostas

3

Com um comando como esse, você pode querer evitar que as variáveis estejam vazias, independentemente de como isso possa acontecer:

$ cat foo.sh
#!/bin/bash
ReportDir=/somepath
FileNam=$(echo ...) # oops, a typo
# ... 
rm -rf -- "${ReportDir:?}/${FileName:?}"

$ bash -x foo.sh
+ ReportDir=/somepath
++ echo ...
+ FileNam=...
foo.sh: line 5: FileName: parameter null or not set

A expansão ${parameter:?message} é encerrada com um erro se parameter estiver vazio ou não configurado. A mensagem padrão geralmente é boa, então eu não dei uma no código acima.

Como alternativa, basta verificar manualmente, mas isso é detalhado e ainda propenso a erros de digitação:

if [ -z "$FileName" ] ; then
    echo "FileName is empty!" >&2
    exit 1
fi
rm -rf -- "$ReportDir/$FileName"
    
por 19.12.2017 / 09:46
2

Como StartDate , StopDate e ReportDir não estão definidos no script que você nos mostrou, presumo que este não seja o script inteiro. Então:

$ cat foo.sh
ReportDir=foo
# commands from what you have shown, omitting 'expect' and db command
FileName=' echo "report_$StartDate:$StopDate.csv" | sed 's/\ /_/g''

rm -rf $ReportDir/$FileName
$ bash -ux foo.sh
+ ReportDir=foo
foo.sh: line 2: StartDate: unbound variable
++ sed 's/\ /_/g'
+ FileName=
+ rm -rf foo/

Claramente expandiu FileName para nada e executou rm -rf foo/ .

    
por 19.12.2017 / 08:50
-1

Considere usar sshpass em seu lugar.

SSHPass is a tiny utility, which allows you to provide the ssh password without using the prompt. This will very helpful for scripting. SSHPass is not good to use in multi-user environment. If you use SSHPass on your development machine, it don't do anything evil.

    
por 19.12.2017 / 09:44