'how can i expect ssh and run shell command?

i want to mkdir at remote machine, but i dont know if the dir exists, how can i do this?

i use spawn ssh username@ip bash -c [ -d $dest_file ] && echo ok || mkdir -p $dest_file

and returns

    while executing
"-d $dest_file "
    invoked from within
"[ -d $dest_file ] && echo ok || mkdir -p $dest_file"
    (file "mkdir.exp" line 22)

i cant use ssh-key because my ip is dynamic



Solution 1:[1]

First, you probably don't need bash -c because ssh is already executing the command with your remote shell.

Secondly, you're not sufficiently quoting your ssh arguments. You're writing an expect script, which uses the tcl programming language, and [ is a special character that will attempt to evaluate its contents as a tcl command and return the output (read more here). For this to work properly, you would need to escape the opening [ to get tcl to interpret it literally:

spawn ssh localhost \[ -d $dest_file ] && echo ok || mkdir -p $dest_file

This seems to work correctly on my system, but as I indicate in a comment it would be much easier to drop all the conditionals and just run:

spawn ssh localhost mkdir -p $dest_file

This accomplishes the same thing and doesn't run afoul of any quoting issues.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 larsks