Search code examples
bashunixsshsedsudo

bash variable substitution from remote command using sed


I am trying to add a user "demouser" to /etc/sudoers of a remote server and I want to pass the username from a variable.

This works, but I want to use a variable $USERNAME instead of demouser

ssh centos@$remote_host -t  'sudo sed -i "\$ademouser        ALL=(ALL)       NOPASSWD:ALL" /etc/sudoers'

I tried using this but it's not working.

export USERNAME=demouser    
ssh centos@remote_host bash -c "'sudo sed -i "\$a$USERNAME ALL=(ALL)       NOPASSWD:ALL" /etc/sudoers'" 
Error: -bash: syntax error near unexpected token `('

Solution

  • Parameters will not expand in single quotes, one can close them, and expand in double quotes instead:

    ssh user@host 'sed "s/'"$localVar"'/replacement/" file'
                          ^^
                          |Enter double quotes to avoid word splitting and globbing
                          Exit single quotes to expand on client side.
    

    You should however know that the command send to the server is:

    sed "s/abc/replacement/" file
    

    Which might cause problems as we are now using double quotes on the server, one can send single quotes as well, but it quickly becomes as mess:

    ssh user@host 'sed '\''s/'"$localVar"'/replacement/'\'' file'
                       ^ ^
                       | Escaped remote single quote
                       Close local single quote
    

    This will become:

    sed 's/abc/replacement' file