Haste makes waste

linux中字符`$`的处理

Posted on By lijun

在处理转义字符时遇到了一个棘手问题,就是用单引号''也无法将$传递给程序,最终将$用ASCII码\044传递完美解决了问题。

./execute-script.sh > mylog.txt 2> errorlog.txt,程序实现的功能:

  • 执行入口脚本execute-script.sh,将结果以覆盖形式输出到mylog.txt,错误日志输出到errorlog.txt
  • execute-script.sh中,将目标主机IP,以及用户名密码,和需要执行的命令,提供给auto_ssh_command.sh函数。
  • auto_ssh_command.sh函数,根据接收的主机IP以及用户名密码等,执行输入的命令。

1. execute-script.sh 主程序

  • mylist.txt: 中存储了主机的IP地址
  • auto_ssh_command.sh: 是另一个脚本程序,用于SSH连接,以及将命令发送给目标主机
  • $nm "USERID" "PASS\044WORD": 分别是主机IP,用户名和密码,另外\044$的ASCII码
  • command1:这是传递给目标主机的命令
#!/bin/sh

mylist="mylist.txt"

. auto_ssh_command.sh

for nm in `cat $mylist`; do
  echo "-------------------------------------------------------------"
  echo $nm
  auto_ssh_command $nm "USERID" "PASS\044WORD" "command1" "command2" "command3"
  echo "--------------------------------------------------------------"
done

exit 0

2. auto_ssh_command.sh 被调用程序-执行SSH连接和传递命令

  • $1:调用它传递过来的参数,比如这里就是$nm
  • local:指的是一个局部变量,只在当前block内有效
  • expect,spawn,send:与程序之间实现交互,新开启一个进程,expect中为预先设想的输入,如果被满足,则将send内的内容传递过去。详细参考使用Expect实现脚本自动化运行
#!/ bin/sh

auto_ssh_command() {

host=$1
id=$2
pass=$3
cmd1=$4
cmd2=$5
cmd3=$6

local PR='(#|\\$) $'

expect -c "
    set timeout 3
    spawn ssh ${id}@${host}
   while (1) {
    expect  \".ssh/id_rsa':\"
    send \"\r\"

    expect  \".ssh/id_dsa':\"
    send \"\r\"

    expect  \"word:\"
    send \"${pass}\r\"

    expect -re \"$PR\"
    send \"${cmd1}\r\"

    expect -re \"$PR\"
    send \"${cmd2}\r\"

    expect -re \"$PR\"
    send \"${cmd3}\r\"

    expect -re \"$PR\"
    send \"exit\n\"
 }   "
}