使用特殊字符的SSH远程执行命令

执行远程命令时出现问题,通过具有特殊字符的SSH。 我试图从MySQL导出数据库作为备份的目的。 这是我在我的本地脚本中的命令:

#!/bin/bash ssh user@host "mysqldump -u dbname -p'p$ssw0rd' --lock-tables=false dbname > ~/sites/mysite/backup/dbname.sql" 

正如你所看到的,我正在使用我的密码附近的字符。 当我执行这个脚本时,我得到以下错误:

 mysqldump: Got error: 1045: Access denied for user 'dbname'@'localhost' (using password: YES) when trying to connect 

但是,当我手动进入机器并执行命令时,它执行得很好。 我得到的印象是,通过ssh执行命令丢失了一些东西,并且密码没有通过。

我怎样才能执行我的命令与特殊字符通过SSH?

您可以尝试转移传递给ssh的命令中的特殊字符。 在这种情况下你的

P $ ssw0rd

p \ $ ssw0rd

由于您使用的shell可能会以不同的方式解释“\”字符,因此我无法为您的案例提供100%的解决scheme,但尝试并不会造成任何负面影响。

你为什么不直接在选项文件中指定你的凭证呢?

编辑~/.my.cnf并添加如下内容:

 [mysql] user = 'dbname' password = 'p$ssw0rd' 

确保你运行$ chmod 600 ~/.my.cnf来限制对这个文件的访问。

那么你不需要在你的SSH命令中指定这些。 无论如何,这可以说是一种更安全的方法,因为用户名/密码不会出现在~/.bash_history 正在运行的进程列表中(所有用户均可查看)。