A few other points for you, concerning the command posted in the OP:
for i in `cat /tmp/ip `; do echo $i ; ssh $i " if [ -d /tmp/test ]; then echo 'hi it is done ' else echo ' Not done ' fi "; done
0) Please use ***[code][/code]
*** tags around your code and data, to preserve the original formatting and to improve readability. Do not
use quote tags, bolding, colors, "start/end" lines, or other creative techniques.
1) Don't Read Lines With For
2) Useless Use Of Cat Backticks
(really the same as DRLWF).
3) $(..) is highly recommended over `..`
4) QUOTE ALL OF YOUR VARIABLE EXPANSIONS
5) When using bash
, it's recommended to use [[..]]
for string/file tests, and ((..))
for numerical tests. Avoid using the old [..]
test unless you specifically need POSIX-style portability.
6) Store the commands you want to send in a variable first*. That will improve readability and make protecting it from the current shell much easier (assuming you quote it properly).
(caveat: I've never used ssh
personally, so I have no idea if the given syntax is correct)
commands='if [[ -d /tmp/test ]]; then echo "hi it is done" ; else echo "Not done" ; fi'
while read -r server; do echo "$server" ; ssh "$server" "$commands" ; done </tmp/ip
*Note that usually this is a bad idea
. But in this case the "commands" are actually data to be manipulated and sent somewhere else, rather than code for the shell to run.