Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 在使用expect、ssh、ant和mysqldump时正确转义引号和参数_Shell_Ant_Ssh_Mysqldump_Expect - Fatal编程技术网

Shell 在使用expect、ssh、ant和mysqldump时正确转义引号和参数

Shell 在使用expect、ssh、ant和mysqldump时正确转义引号和参数,shell,ant,ssh,mysqldump,expect,Shell,Ant,Ssh,Mysqldump,Expect,我们目前有一个工作的ant脚本,它将使用mysqldump将远程服务器上的数据库转储到该远程服务器上的文件中。我们使用ant的exec任务运行expect脚本,以ssh方式连接到远程机器并运行mysqldump命令。我正在尝试更新命令,将转储限制为只包含少于3个月的数据。我遇到了一些令人讨厌的关于引用和参数的逃避问题 下面是我正在尝试使用的命令行: expect -f ssh-pass.exp <SERVER_PASSWD> ssh <USER>@<IP_ADDRE

我们目前有一个工作的ant脚本,它将使用mysqldump将远程服务器上的数据库转储到该远程服务器上的文件中。我们使用ant的exec任务运行expect脚本,以ssh方式连接到远程机器并运行mysqldump命令。我正在尝试更新命令,将转储限制为只包含少于3个月的数据。我遇到了一些令人讨厌的关于引用和参数的逃避问题

下面是我正在尝试使用的命令行:

expect -f ssh-pass.exp <SERVER_PASSWD> ssh <USER>@<IP_ADDRESS> \"mysqldump -h localhost -u user --password=passwd staging --where=\"createTimeFi > now() - interval 3 month\" --ignore-table=staging.JMS_MESSAGES --ignore-table=staging.JMS_ROLES --ignore-table=staging.JMS_SUBSCRIPTIONS --ignore-table=staging.JMS_TRANSACTIONS --ignore-table=staging.JMS_USERS --ignore-table=staging.TIMERS > dump.sql\"

我尝试了ssh命令和mysqldump的where参数的各种转义引号组合,但没有成功。有时expect会抱怨“interval”是未知命令。有时,在我的本地计算机上,该命令会创建名为“now”或“dump.sql”的文件,这似乎表明我的本地shell正在使用引号并在不应该使用的地方执行重定向,或者它会抱怨无效令牌(即paren)

这不是一个预期问题。这只与壳牌的报价有关

您需要将长的mysqldump命令及其参数作为一个“单词”传递,因此无法转义外部引号。您可以使用单引号作为外部引号,这样就不必转义内部双引号

expect-f ssh-pass.exp ssh@'mysqldump-h localhost-u user--password=passwd staging--where=“createTimeFi>now()-间隔3个月”--忽略table=staging.JMS\u消息--忽略table=staging.JMS\u角色--忽略table=staging.JMS\u订阅--忽略table=staging.JMS\u事务--忽略table=staging.JMS\u用户--忽略table=staging.TIMERS>dump.sql'

====

更新:关于您的Tcl的一些注意事项(expect)

  • 使用
    [lindex$argv 0]
    而不是
    [lrange$argv 0]
  • mysqlcommand是用大括号发送的,因为您将其创建为列表(
    [lrange$argv 3 end]
    ),但它应该是单个字符串。既然您使用了正确的shell报价,
    [lindex$argv 3]
    就足够解决这个问题了。如果未将其作为一个参数传递,则
    set remote_command[join[lrange$argv 3 end]
    然后
    spawn$command$arg1$arg2

  • 谢谢这让我很接近。我不得不改用bash而不是zsh,而且我还不得不调整我的expect脚本,因为mysqldump命令被发送时周围有大括号。请注意,在引号中,您还可以添加换行符和制表符缩进以使其可读。如果你真的发疯了,你可以在一个大引号里放一个200行的脚本(这并不总是一个好主意)。@glennjackman感谢关于使用lindex的提示-我在一些输入上也用了大括号,这就解决了+1问题
    set password [lrange $argv 0 0]
    set command [lrange $argv 1 1]
    set arg1 [lrange $argv 2 2]
    set arg2 [lrange $argv 3 end]
    puts "command: $command"
    puts "arg1: $arg1"
    puts "arg2: $arg2"
    set timeout -1
    spawn $command $arg1 "$arg2"
    match_max 100000
    expect "*?assword:*"
    puts "\rsending password..."
    send -- "$password\r"
    puts "\r**************** Running remote command, wait... ******************"
    expect eof