How do i write a shell script for checking website live or not - bash

I am writing a shell script to monitor website live or not and send an email alert below is my code
#!/bin/bash
if [[ curl -s --head --request GET http://opx.com/opx/version | grep "200 OK" > /dev/null] && [ curl -s --head --request GET http://oss.com/version | grep "200 OK" > /dev/null ]]
then echo "The HTTP server on opx.com and oss.com is up!" #> /dev/null
else
msg="The HTTP server opx.com Or oss.com is down "
email="opx-noc#opx.com"
curl --data "body=$msg &to=$email &subject=$msg" https://opx.com/email/send
fi;
if i run this code i got
./Monitoring_Opx_Oss: line 2: conditional binary operator expected
./Monitoring_Opx_Oss: line 2: syntax error near `-s'
./Monitoring_Opx_Oss: line 2: `if [[ curl -s --head --request GET http://opx.com/opx/version | grep "200 OK" > /dev/null] && [ curl -s --head --request GET http://oss.com/version | grep "200 OK" > /dev/null ]] '
Please correct me...

Change it do this:
if [ $(curl -s --head --request GET http://opx.opera.com/opx/version | grep "200 OK" > /dev/null) ] && [ $(curl -s --head --request GET http://oss.opera.com/version | grep "200 OK" > /dev/null) ]
To check the status of a command inside an if, you have to do it like
if [ $(command) ]
while you were using
if [ command]
note also the need of spaces around [ ]: if [_space_ command _space_ ]
Update
Based on Ansgar Wiechers's comment, you can also use the following:
if curl -s --head --request GET http://opx.com/opx/version | grep "200 OK" > /dev/null && curl -s --head --request GET http://oss.com/version | grep "200 OK" > /dev/null;
That is,
if command && command

Related

How to check if commands inside the deployment.yaml are working?

I'm trying to write some bash commands inside my deployment.yaml file. I want to execute this commands at the postStart.
How can I check if the commands are working well? And if possible, how to get the node IP address?
lifecycle:
postStart:
exec:
command:
- "sh"
- "-c"
- |
GATEWAY_HTTPS_NAME="${GATEWAY_SERVICE_NAME}_SERVICE_PORT_HTTPS"
GATEWAY_HTTPS_PORT=$(eval "echo \$$GATEWAY_HTTPS_NAME")
cat /app/gateway/ip
BOOL=true
while [ $BOOL ]; do
if [ "$GATEWAY_HTTPS_PORT" != '' ]; then
nohup sh -c "sleep 30; cat /app/gateway/ip | xargs -I[] curl -H 'Content-Type: application/json' -d '{}' -k https://[]/actuator/refresh" &
ROUTES=$(nohup sh -c "cat /app/gateway/ip | xargs -I[] curl -H 'Content-Type: application/json' -d '{}' -k https://[]/actuator/gateway/routes")
else
nohup sh -c "sleep 30; cat /app/gateway/ip | xargs -I[] curl -H 'Content-Type: application/json' -d '{}' -k http://[]/actuator/refresh" &
ROUTES=$(nohup sh -c "cat /app/gateway/ip | xargs -I[] curl -H 'Content-Type: application/json' -d '{}' -k http://[]/actuator/gateway/routes")
fi
NODE_IP=???
echo $ROUTES
if [ $ROUTES[*] =~ $NODE_IP ]; then
BOOL=$false
fi
BOOL=$false
sleep 10
done
You can validate the command using exit status, I usually do that by adding a double pipe which will output the exit status if something went wrong, here is an example:
ls /unexistant/dir &>/dev/null && echo Success, Code=$? || echo Something went wrong, Code=$?
This will obviously throw an error and run the commands after double pipe since the status code not equals 0 will return Something went wrong, Code=2
Instead, if we run this:
ls /existant/dir &>/dev/null && echo Success, Code=$? || echo Something went wrong, Code=$?
This will run the first command with success and exit status will be 0 which means success, this is the output: Success, Code=0
You can of course play around with this and read more about double pipe

Check if a list of urls exist or not in bash with curl

I'm trying to check if a list of urls are valid or not. I'm trying this Bash but I'm no getting the correct syntax.
for url in $(cat domains.txt)
do curl --output /dev/null --silent --head --fail "$url"; then
echo "URL exists: $url"
else
echo "URL does not exist: $url"
done
Can anyone give me a hand?
you're missing an if (and corresponding fi) to make your code work.
#!/bin/bash
for url in $(cat domains.txt)
do
if curl --output /dev/null --silent --head --fail "$url"; then
echo "URL exists: $url"
else
echo "URL does not exist: $url"
fi
done
You can also can make that the script check each url and if it's a redirection , give you the redirected url:
#!/bin/bash
for URL in $(cat urls.txt) ; do
res="$(curl --silent --head --location --output /dev/null --write-out '%{http_code}' $URL | grep '^2')"
if [[ $res == 200 ]]; then
curl -s -L -I -o /dev/null -w $URL' -> %{url_effective}\n' $URL;
else
echo "$URL -> "does not exist""
fi
done
`

Curl echo Server response Bash

I'm trying to create a bash script that check url from list status code and echo server name from header. I'm actually new.
#!/bin/bash
while read LINE; do
curl -o /dev/null --silent --head --write-out '%{http_code}' "$LINE"
echo " $LINE" &
curl -I /dev/null --silent --head | grep -Fi Server "$SERVER"
echo " $SERVER"
done < dominios-https
I get the following output
301 http://example.com
grep: : No such file or directory
1) while read LINE can not use last line if text file not ended with new line.
2) You don't set "$SERVER" anywhere, and grep say it
3) Not all servers return "Server:" in headers
try it:
scriptDir=$( dirname -- "$0" )
for siteUrl in $( < "$scriptDir/myUrl.txt" )
do
if [[ -z "$siteUrl" ]]; then break; fi # break line if him empty
httpCode=$( curl -I -o /dev/null --silent --head --write-out '%{http_code}' "$siteUrl" )
echo "HTTP_CODE = $httpCode"
headServer=$( curl -I --silent --head "$siteUrl" | grep "Server" | awk '{print $2}' )
echo "Server header = $headServer"
done

if condition in shell scripting based on 404 unauthorized error

Here is my shell script. I want to put a condition to my curl commands based on the status i get. I need help in grepping "Http/1.1 401 Unauthorized" from the first curl command. After that i need to put it in a condition if status is 401, execute 2nd and 3rd curl command. Pls help
STATUS="HTTP/1.1 401 Unauthorized"
read $STATUS
for ((i=1; i<=2000; i++)); do
curl -i -vs -X POST -D post.txt -H "$SESSION_TOKEN" -H "$AUTH_TOKEN" -H "Accept:$ACCEPT_HEADER" -H "Content-Type:text/plain" "http://$BASE_URI/api/$PLATFORM//$CHANNEL_ID/subscription" | grep -e "*Unauth*" >> post.txt
if [$STATUS]
then
curl -i -vs -X POST -D tmp.txt -H "Content-Type:text/plain" --data "$SECRET" -H "Accept:$ACCEPT_HEADER" -H "Connection:close" http://$BASE_URI/api/${PLATFORM}/authenticate >> tmp1.txt
SESSION_TOKEN=`grep SessionToken tmp.txt`
curl -i -vs -X POST -D tmp2.txt -H "$SESSION_TOKEN" -H "Content-Type:text/plain" -H "Content-Type:application/json" --data "{ \"username\":\"$USER_NAME\",\"password\":\"$PASSWORD\", \"rememberMe\":\"false\"}" http://$BASE_URI/api/web/users/authenticate >> data.json
AUTH_TOKEN=`grep Authorization tmp2.txt`
continue
fi
done
The proper solution :
res=$(curl -s -o /dev/null -w '%{http_code}\n' http://google.fr)
if ((res == 404)); then
echo "404 spotted"
fi
or
res=$(curl -s -o /dev/null -w '%{http_code}\n' http://google.fr)
if [[ $res == 404 ]]; then
echo "404 spotted"
fi
Check
man curl | less +/'^ *-w'
You have to capture the curl output and examine the status line:
output=$( curl -i ... )
if [[ $output == "$STATUS"* ]]; then
# I was unauthorized
else
# ...
fi
Be aware that [ (and [[ I use in my answer)
is not mere syntax, it is a command, and as such it requires a space between it and its arguments

Shell integer expression expected?

response=$(curl -sL -w \\n%{http_code} "http://<ip_addr>/api/1/app" -X DELETE)
echo response
if [ "$response" -eq 200 ]
then
echo "Got 200 OK"
else
echo "not getting the result"
fi
What i'm trying to do is to get the http response code.
I'm positive that the response should be 200 OK
When I run the script I'm getting
{
"result":true
}
200
tst.sh: line 302: [: {
200: integer expression expected
I even don't want to display
{
"result":true
}
I just want to print 200 and compare 200.
Just with curl command:
curl -sL -w '%{http_code}' "http://<ip_addr>/api/1/app" -X DELETE -o /dev/null
Get the last line of the output.
response=$(curl -sL -w \\n%{http_code} "http://<ip_addr>/api/1/app" -X DELETE | tail -1)
Besides tail -n you can also use:
awk 'END { print }'
sed -n '$p'
Another way if you're using bash is to remove everything before the last line:
shopt -s extglob
response=${response##*[[:space:]]}
In your above, you are missing a $ in your first echo, but no matter. You can strip the {"result":true} from the $response string
before the if statement:
response=${response#*\}\ }

Resources