Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I have a problem executing a remote command through SSH that has special character in it. I'm trying to export a database from MySQL for back up purposes. This is the command I have in my local script:

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

As you can see I'm using the ' characters around my password. When I execute this script I get the following error:

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

However, when I ssh into the machine manually and execute the command it executes just fine. I get the impression that through executing the command through ssh something is lost and the password doesn't come through.

How can I execute my command with special characters through ssh?

share|improve this question

2 Answers 2

up vote 3 down vote accepted

You can try escaping the special characters in the command that you are passing to the ssh. In which case your

p$ssw0rd

becomes

p\$ssw0rd

Since the shell you are using might interpret "\" character differently, I can not vouch for 100% solution to your case, but it won't hurt to try.

share|improve this answer
    
This actually worked! I still find it odd that when I run the script when logging in with ssh manually works fine but to run it as a remote command I suddenly need to escape. Any how, all good. –  Luke Mar 4 '13 at 3:41
    
when you are typing your password on the login screen, the keyboard scanner, tty, takes each character you type, literally (there are exceptions to that, but not the matter of subject here), but when you send them via ssh, double quotes, the special characters, like \, $, ;, etc., are interpreted with their special meanings. This is the reason why your password was failing. It is a common occurrence. –  MelBurslan Mar 4 '13 at 5:01
    
Funny thing is, my password obviously isn't p$ssw0rd but it does have a $ in it. :) –  Luke Mar 4 '13 at 6:14

Why don't you just specify your credentials in an options file?

Edit ~/.my.cnf and add something like this:

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

Make sure you run $ chmod 600 ~/.my.cnf to restrict access to that file.

Then you don't need to specify those in your SSH command. This is arguably a safer way to do thing anyway, as usernames/passwords don't show up in either your ~/.bash_history or the running process list (which is viewable by all users).

share|improve this answer
    
Sorry, I can't do this. Thanks for the suggestion though. –  Luke Mar 4 '13 at 3:42

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.