3

ローカル コンピューター シェルで実行する 2 つのスクリプトがあります。最初のスクリプトは、内部で期待スクリプトを呼び出す BASH シェルです。bash シェルは次のとおりです。

BASH シェルスクリプト SaveOnRemote.sh

#!/bin/bash
REMOTE_IP_ADDR="192.168.100.67"
REMOTE_PASS="some_pass_with_whitespaces"     
#The following line space is defined {\ }
PC_EXEC_FILE="/home/workspace/prog/Modified\ code/test/test_file"

#The following line space is included in the variable
TARGET_EXEC_FILE="/sd/1/test/test file target dir/target_file"

#Calling the expect script
scp_ToTarget.exp  $REMOTE_PASS $REMOTE_IP_ADDR $PC_EXEC_FILE $TARGET_EXEC_FILE

BASH スクリプト SaveOnRemote.sh の終わり

もう 1 つ 、bash シェル内で呼び出されるscp_ToTarget.exp Tcl または Expect スクリプトがあります。

Tcl 期待 SCRIPT scp_ToTarget.exp

#!/usr/bin/expect -f
set remote_password [lrange $argv 0 0]     
set remote_ipaddr [lrange $argv 1 1]   
set src [lrange $argv 2 2]    
set dst [lrange $argv 3 3]     
set timeout 3    
log_user 1

eval spawn scp $src root@$remote_ipaddr:$dst    
match_max 100000

#Look for passwod prompt
set timeout 5

expect {    
  "*?assword:*" {    
  send $remote_password\r\n    
  }    
}

## End of Tcl Expect SCRIPT scp_ToTarget.exp

このスクリプトが機能せず、不明なディレクトリ/ファイル エラーが発生します

実際、ファイル名、パスワード、さらにはディレクトリにもスペースを避けることはできず、スクリプトを機能させる必要があります。

私の知る限り、次のようなコマンドを送信した場合

scp "/tmp/try me.txt" root@192.168.100.67:"/sd/no tries/" 

それは機能し、空白に問題はありません。しかし、Tcl で二重引用符を追加するとすぐに

"$src" または \"$src\" または "'$src'"

それらのどれも私が望むように正確に構文を作成しませ.Tclは二重引用符を中括弧に変更します.

Bash/Tcl でさまざまな文字列変数を処理するための適切なリファレンスまたは Web リンクを歓迎します

4

3 に答える 3

0

パラメータを渡すときは、シェルスクリプトで引用符を使用する必要があります。

これは悪いです:

scp_ToTarget.exp  $REMOTE_PASS $REMOTE_IP_ADDR $PC_EXEC_FILE $TARGET_EXEC_FILE

これはいい:

scp_ToTarget.exp "$REMOTE_PASS" "$REMOTE_IP_ADDR" "$PC_EXEC_FILE" "$TARGET_EXEC_FILE"

変数を引用しなかったため、シェルは変数を複数の単語に拡張し、Expectスクリプトは4つを超えるパラメーターを受け取ります

シェルスクリプトで変数を引用すると、Expectは計画どおりに変数を受け取ります。

于 2012-12-13T17:56:08.247 に答える
0

ありがとう、私は次のように実装しました

REMOTE_PASS="some_pass_with_whitespaces"
REMOTE_PASS="\"$REMOTE_PASS\""
# I have no clue if the passwords with whitespace or \ works fine for password

#The following line space is defined {\ }
PC_EXEC_FILE="/home/workspace/prog/Modified\ code/test/test_file"
eval PC_EXEC_FILE=$PC_EXEC_FILE
PC_EXEC_FILE="\"$PC_EXEC_FILE\""

#The following line space is included in the variable
TARGET_EXEC_FILE="/sd/1/test/test file target dir/target_file"
eval TARGET_EXEC_FILE=$TARGET_EXEC_FILE
TARGET_EXEC_FILE="\"$TARGET_EXEC_FILE\""

# The script is supposed to handle strings with {spc} and {\spc} used for
# directories but the filenames can not contain spaces 

#Calling the expect script
eval scp_ToTarget.exp  $REMOTE_PASS $REMOTE_IP_ADDR $PC_EXEC_FILE $TARGET_EXEC_FILE

期待ファイルで、expect {の後に行を追加しました

  "*?assword:*" {    
  send $remote_password\r\n  
  interact 
  }    

ディレクトリ内のスペースの問題は解決しますが、ファイル名の問題は解決しません!

ファイル名のスペースを解決する方法についてまだ混乱しています:(

于 2012-12-14T13:02:43.193 に答える