![SSH远程执行带有特殊字符的命令](https://linux22.com/image/607313/SSH%E8%BF%9C%E7%A8%8B%E6%89%A7%E8%A1%8C%E5%B8%A6%E6%9C%89%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%E7%9A%84%E5%91%BD%E4%BB%A4.png)
我在通过 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 执行带有特殊字符的命令?
答案1
您可以尝试转义传递给 ssh 的命令中的特殊字符。在这种情况下,您的
p$ssw0rd
变成
p\$ssw0rd
由于您使用的 shell 可能会以不同的方式解释“\”字符,我无法保证 100% 解决您的问题,但尝试一下也无妨。
答案2
为什么你不直接在选项文件中指定你的凭证?
编辑~/.my.cnf
并添加如下内容:
[mysql]
user = 'dbname'
password = 'p$ssw0rd'
确保您运行$ chmod 600 ~/.my.cnf
以限制对该文件的访问。
那么你就不需要在 SSH 命令中指定这些了。这可以说是一种更安全的方法,因为用户名/密码不会出现在你的~/.bash_history
或者正在运行的进程列表(所有用户都可以查看)。