3

我有两个脚本要在本地计算机 shell 中运行第一个脚本是 BASH shell,它在自身内部调用期望脚本 bash shell 如下

BASH SHELL 脚本 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 结束

还有一个我们有scp_ToTarget.exp Tcl 或 Expect 脚本,它在 bash shell 中被调用

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 将双引号更改为大括号等我陷入了这个问题,我不知道如何在bashExpect 或 Tcl中解决这个问题

任何用于在 Bash/Tcl 中处理不同字符串变量的好的参考或网络链接都值得赞赏谢谢

4

3 回答 3

0

You need to use quotes in the shell script when you're passing the parameters:

This is bad:

scp_ToTarget.exp  $REMOTE_PASS $REMOTE_IP_ADDR $PC_EXEC_FILE $TARGET_EXEC_FILE

This is good:

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

Because you did not quote the variables, the shell exands them into multiple words and the Expect script receives more than 4 parameters

Once you quote the variables in the shell script, Expect will receive them as you have planned.

于 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

在期望文件中,我在期望{之后添加了一行

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

它解决了目录中有空格但文件名没有空格的问题!

我仍然对如何解决文件名中的空格感到困惑:(

于 2012-12-14T13:02:43.193 回答
0

使用这样的字符串是否可以解决问题:

REMOTE_PASS="\\\"$REMOTE_PASS\\\""

我认为您似乎要求的是“双重逃避”。

(我知道这是一个老问题,但我发现它用谷歌搜索,其他人也可能......他们可能会很高兴找到至少最终解决了我的问题的东西。)

于 2017-10-04T14:57:43.483 回答