![]() |
Shell script to check whether directory exists on remote server
Hi All,
I am new to scripting, would like to have a script that tests whether a directory exists on remote host & display the message accordingly. The remote hostname can be provided by means of file containing list of hostnames. Can use rsh for connecting to remote host. I tried with couple of scripts by searching google but didn't get desired result. Please help me, below is my efforts, $file contains list of hostnames. for i in $file do if ( [ `rsh $i test -d /tmp/.X*` ] || [ `rsh $i test -d /scratch/.X*` ] ) then echo "directory exist" else exit 0; fi done Thanks in advance, appreciate all the efforts. |
You have a very nice test if your remote server is up....
The command [ `rsh $i test -d /tmp/.X*` ] will always yield "0" when you are able to access the remote server.. It will not refect the value of the test command's result. You'd probably want something like [ `rsh $i "[[ -d /tmp/.X* ]] && echo true"` == "true" ] Here you do the test if your directory is on your remote server and you pass the keyword true. On your local server you check for the keyword. Please note that the test on the remote server is ksh and does not necesary work on your server. I do not want to supply you with a proper solution, I just want to point out where your mistake is. |
results
test() seems fine...
Quote:
What are the results you are getting and what are the desired results? |
Hi zjoske,
Thanks for the help, ran the script as per your suggestion getting following error : #!/usr/bin/bash if [ `rsh us01term4 "[[ -d /tmp/testsav ]] && echo true"`=="true" ] then echo "directory exists" else echo "directory doesn't exist" fi ~/lsf_scripts % ./t.sh [[: Command not found. directory exists The directory /tmp/testsav doesn't exist but the output displayed is "directory exists"/ Quote:
|
Hi
I would like to chek whether either /tmp/.X* or /scratch/.X* exists & if they do display message the directory exists accordingly. Following is the script I run & output is as follows : #!/usr/local/bin/bash file=`~/lsf_scripts/bhosts_output` for i in $file do if [[ `rsh $i test -d /tmp/.X*` ]] || [[ `rsh $i test -d /scratch/.X*` ]] then echo "directory exist" else echo "directory doesn't exit" fi done #./p2.sh /remote/ushome17/sav/lsf_scripts/bhosts_output: line 1: atto342: command not found /remote/ushome17/sav/lsf_scripts/bhosts_output: line 2: atto343: command not found For every hostname in the for loop for value of i an error command not found is displayed on the screen, nothing else. From the CLI I can do rsh or ping to the hosts atto342, atto343. Quote:
|
try using Wrap [CODE]#[/CODE] tags for easy to read source
So for i in FILE it is going to go by each line in the file. If there is information, especially divided by a space ' ', then when bash reads it it will read the second piece as an argument or another command. So, I am thinking that is what is going on here: atto343: command not found.
Code:
...Can you... Code:
# cat FILE |
If rsh behavies like ssh, then:
ssh user@host "[ -d $DIR ]" && echo "dir exists" will work. Code:
DIRS="Documents Document Downloads Download"You shouldn't be using rsh if your lan has a network connection. Ssh is a more secure replacement. You can use: eval $(ssh-agent) ssh-add to be able use public key authentication, and not have to enter the passphrase each time. --- Be careful you understand when and where a variable is referenced. This example will send the command verbatim to the server. ssh user@host 'ls $HOME/Documents/' This example will evaluate the variable $dir before executing the ssh command: ssh user@host "ls $dir/*.pdf" In my original example, the test "[ -d $dir ]" is made on the server after $dir is referenced on the client. The rest of the line runs on the client ( && echo "$dir exists" || echo "$dir doesn't exist" ). |
Hi Sudhirav,
If it does not work it might be the shell, try replacing "[[" with "[". I am working with the kshell, it works both for me (this is just the test on the remote server): ==> with two brackets zrh1lw01[teuniss] rsh zrh1l013 "[[ -f caramba ]] || echo false" false zrh1lw01[teuniss] rsh zrh1l013 "[[ -f superkaramba-0.39.tar.gz ]] || echo false" zrh1lw01[teuniss] ==> with one bracket zrh1lw01[teuniss] rsh zrh1l013 "[ -f superkaramba-0.39.tar.gz ] || echo false" zrh1lw01[teuniss] rsh zrh1l013 "[ -f caramba ] || echo false" false If the test passes an retuns false in this case, you can process it in your script with an additional if statement. Quote:
|
Sudhirav,
I wanted to show you what I meant with my statement that you ae doing a "connectivity" test With test I can check if a file exists. You have to test the result by verifying the variable $? zrh1lw01[teuniss] test -f caramba ; echo $? 1 zrh1lw01[teuniss] test -f superkaramba-0.39.tar.gz | echo $? 0 In the first case, the file caramba does not exist, the test failed The file superkaramba-0.39.tar.gz does exist hence my variable $? is 0 However, doing this with ssh (or rsh, does not matter) on a remote server you will get zrh1lw01[teuniss] ssh zrh1l013 test -f superkaramba-0.39.tar.gz | echo $? 0 zrh1lw01[teuniss] ssh zrh1l013 test -f caramba | echo $? 0 Why? It does not matter what the contents of $? on the remote machine is. The value of $? is on the local machine and reflects the status of ssh. The ssh command ran. Hence the value of "0" ... |
Special Characters
Bash Scripting Tutorial, Special Characters... http://tldp.org/LDP/abs/html/special-chars.html
Single and Double bracket explanation... http://tldp.org/LDP/abs/html/testcon....html#TTESTREF |
Don't test. List and count:
Code:
for host in $list ; doNominal Animal |
| All times are GMT -5. The time now is 08:04 PM. |