0

telnetを使用してdebianからWindowsサーバーに接続する小さなスクリプトがあります。

サーバー上にipsとpathを含むテキストファイルがあります。

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などをエスケープする)?

4

2 に答える 2

0

いくつかの解決策を見つけました:

send "cd $(printf '%q' $2)\r"
于 2013-01-15T12:35:32.160 に答える
0

本当にこれを行う良い方法があるとは思わないでください。私が考えることができる2つのオプション。それが正しくなるまで、引用をいじることができます。しかし、それは面倒で、コードの可読性が大幅に失われます。

私のやり方は、文字列を手動でエスケープすることです。

path=${2// /\\ } # substitutes all instances of ' ' with '\ ' in path
path=${path//\\/\\\\/} # substitutes all instances of '\' with '\\' in path

変数内の文字列操作の詳細については、こちらを参照してください

于 2013-01-15T12:30:19.130 に答える