a diferença entre '..' e “..” quando eu uso ssh usr @ ip 'pscp…'

1

Minha máquina do servidor executou o Window e instalou o Cygwin.

Minha máquina cliente executa o linux.

Na máquina do Clinent. Eu faço isso:

[sikaiwei@login-1-2 v1.4]$ bash test.sh CHUN~19900405 [email protected]:/ifs2/BC_MG/GROUP/sikaiwei/ssh/v1.4
start
PuTTY Secure Copy client
Release 0.63
Usage: pscp [options] [user@]host:source target
   pscp [options] source [source...] [user@]host:target
   pscp [options] -ls [user@]host:filespec
Options:
 -V        print version information and exit
 -pgpfp    print PGP key fingerprints and exit
 -p        preserve file attributes
 -q        quiet, don't show statistics
 -r        copy directories recursively
 -v        show verbose messages
 -load sessname  Load settings from saved session
 -P port   connect to specified port
 -l user   connect with specified username
 -pw passw login with specified password
 -1 -2     force use of particular SSH protocol version
 -4 -6     force use of IPv4 or IPv6
 -C        enable compression
 -i key    private key file for authentication
 -noagent  disable use of Pageant
 -agent    enable use of Pageant
 -batch    disable all interactive prompts
 -unsafe   allow server-side wildcards (DANGEROUS)
 -sftp     force use of SFTP protocol
 -scp      force use of SCP protocol
end

Parece me avisar que eu uso o ' pscp ' no meu arquivo test.sh de forma estranha! Mas eu não sei. E meu test.sh é:

#!/bin/bash
sshpass -p 'CHUN~19900405' ssh [email protected] '
echo start;
touch final_result.txt;
pscp -pw $1  final_result.txt $2;
echo end;
';

Mas quando eu uso ".." em vez de '..', gosto

#!/bin/bash
sshpass -p 'CHUN~19900405' ssh [email protected] "
echo start;
touch final_result.txt;
pscp -pw $1  final_result.txt $2;
echo end;
";

Não repostar erro:

[sikaiwei@login-1-2 v1.4]$ bash test.sh CHUN~19900405 [email protected]:/ifs2/BC_MG/GROUP/sikaiwei/ssh/v1.4
start
end

Eu devo usar '..' ao invés de ".." para usar a variável de ambiente do Server machine.like

[sikaiwei@login-1-2 v1.4]$ sshpass -p 'CHUN~19900405' ssh 172.16.22.53 -l sikaiwei   "getId=$ORANGE;echo $ORANGE;ORANGE=$((ORANGE+1));echo $ORANGE;echo 'getId is '+$getId;"

O $ ORANGE é variável da máquina do servidor.

Então eu devo usar '..' e como ainda usar $ 1, $ 2 para obter argumentos?

    
por orange 20.12.2013 / 09:32

3 respostas

2

Variáveis não são expandidas entre aspas simples, que é como você está passando os comandos na primeira instância. Como tal, no primeiro caso, o shell na extremidade remota nunca recebe seus valores, apenas recebe literal $1 e $2 , e eles não existem, então eles se expandem para nada.

$ var=foo
$ echo '$var'
$var
$ echo "$var"
foo
Por isso,

pscp não obtém valores quando você passa $1 e $2 (porque eles não existem no shell remoto), por isso comete erros na inicialização. É assim que pscp acaba sendo chamado:

pscp -pw final_result.txt

Use aspas duplas quando quiser que as variáveis sejam expandidas pelo shell atual, e não por aspas simples. Usar aspas simples nesse caso seria apropriado apenas se você quisesse que as variáveis fossem expandidas pelo shell remoto .

    
por 20.12.2013 / 09:37
1

No caso de aspas duplas, o shell espia dentro das aspas para procurar três coisas: variáveis indicadas por $ character, comandos a serem executados indicados por aspas para trás e escape dos caracteres usando \ . Além dessas três coisas, não há diferença entre aspas simples e duplas. Verifique os seguintes comandos:

$ foo=42
$ echo "$foo"
42
$ echo '$foo'
$foo
$ echo '\$foo'
\$foo
$ echo "\$foo"
$foo
    
por 20.12.2013 / 23:58
1

Você pode usar aspas simples para seu comando ssh remoto e ainda usar $1 e $2 no script test.sh para acessar valores definidos localmente combinando ssh e bash -c 'cmd1; cmd2' _ arg1 arg2 [...] .

# example of how to combine "ssh" and "bash -c" to get variables expanded by the
# current shell and thus make local values accessible by remote ssh command 
(
set -xv
echo ssh localhost 'bash -c '\''printf "%s\n" "$1" "$2" "$3"  "$4"  "$5" "$PWD" | cat -n'\''' _ arg1 arg2 "$HOME" "$PWD" arg5
ssh localhost 'bash -c '\''printf "%s\n" "$1" "$2" "$3"  "$4"  "$5" "$PWD" | cat -n'\''' _ arg1 arg2 "$HOME" "$PWD" arg5
)


# test.sh
#!/bin/bash
sshpass -p 'CHUN~19900405' ssh [email protected] 'bash -c '\''
echo start;
touch final_result.txt;
pscp -pw "$1"  final_result.txt "$2";
echo end;
'\''' _ "$1" "$2";
    
por 21.12.2013 / 15:27