Shell

當我使用 ssh usr@ip ‘pscp ……’ 時,’..’ 和 ‘..’ 之間的區別

  • April 30, 2016

我的伺服器機器執行 Window,它安裝了 Cygwin。

我的客戶端機器執行linux。

在 Clinent 機器中。我這樣做:

[sikaiwei@login-1-2 v1.4]$ bash test.sh CHUN~19900405 sikaiwei@192.168.9.102:/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

似乎警告我pscp在我的 test.sh 文件中使用了 ’ ’ !但我沒有。我的 test.sh 是:

#!/bin/bash
sshpass -p 'CHUN~19900405' ssh sikaiwei@172.16.22.53 '
echo start;
touch final_result.txt;
pscp -pw $1  final_result.txt $2;
echo end;
';

但是當我使用“..”而不是“..”時,就像

#!/bin/bash
sshpass -p 'CHUN~19900405' ssh sikaiwei@172.16.22.53 "
echo start;
touch final_result.txt;
pscp -pw $1  final_result.txt $2;
echo end;
";

它不會重新發布錯誤:

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

我必須使用“..”而不是“..”來使用 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;"

$ORANGE 是伺服器機器的變數。

所以我必須使用’..’,以及如何仍然使用 $ 1, $ 2 得到爭論?

變數不以單引號展開,這是您在第一個實例中傳遞命令的方式。因此,在第一種情況下,遠端端的 shell 從不接收您的值,它只接收文字 $1and $2,並且它們不存在,因此它們擴展為空。

$ var=foo
$ echo '$var'
$var
$ echo "$var"
foo

pscp``$1因此,當您通過and時不會獲得任何值$2(因為它們在遠端 shell 上不存在),因此它在啟動時會出錯。這就是pscp最終被呼叫的方式:

pscp -pw final_result.txt

當您希望由目前 shell 擴展變數時使用雙引號,而不是單引號。在這種情況下使用單引號僅在您希望通過遠端shell擴展變數時才合適。

引用自:https://unix.stackexchange.com/questions/106005