我使用telnet从debian连接到Windows服务器的小脚本。
服务器上有ips和路径的文本文件:
192.168.1.1 c:\rs_obj\data
192.168.1.2 c:\rs_obj\data
192.168.1.3 c:\new_obj\data
每个服务器都有自己的数据路径。
这是主脚本
while IFS=" ": read -r ip path; do
nohup ./tl.sh $ip $path >> tl_$ip.log &
done < srv_list.txt
这里是tl.sh
#!/bin/bash
echo $(date) : $1 $2
expect -f-<<EOF
set timeout 20
spawn telnet $1
expect "login: "
send "...\r"
expect "password: "
send "...\r"
expect "*="
send 'cd "$2"\r'
expect "data>"
....
send "exit\r"
EOF
exit
问题出在windows路径上 - 如何在行send "cd $2\r"
中传递正确的字符串(转义反斜杠和\ r \ n等等)?
答案 0 :(得分:0)
不要认为有一个好方法可以做到这一点。我能想到的两个选择。你可以用引号拧紧,直到它是正确的。但这很麻烦,会丢失很多代码可读性。
我的方法是手动转义字符串,例如。
path=${2// /\\ } # substitutes all instances of ' ' with '\ ' in path
path=${path//\\/\\\\/} # substitutes all instances of '\' with '\\' in path
可以找到在变量中操作字符串的更多细节here希望这有帮助
答案 1 :(得分:0)
找到了一些解决方案:
send "cd $(printf '%q' $2)\r"