Thursday, May 17, 2012

Why Is My Emails Getting As Spam?

Why Is My Emails Getting As Spam?
Check above things.

First we need to check Email Headers.
1. Return Path
2. To
3. From
4. We should not use CAPS because not only being unprofessional, but it
also triggers spam filters. To land in the Spam folder consistently,
please do not USE ALL CAPS IN THE SUBJECT LINE AND THE BODY FROM TO and
Excessive punctuation (e.g. -/, ;^%#$@+ * "').

E.g. as follows.

1. Email "From : ADMIN ENROLL " getting
spam in gmail.com sometimes and if we not change it will increasing
count.

2. Email "From: noreply@exmaple.com" it
getting in mailbox, check the CAPS deference.

http://php.net/manual/en/function.mail.php
http://www.niso.org/khelp/kmlm/user_help/html/examine_mail_headers.html

Please check this too. It can be understand better. :)
http://www.infusionblog.com/email-marketing/7-ways-for-your-email-to-land-in-the-spam-folder/

Check SPF for Domain.:
http://www.microsoft.com/mscorp/safety/content/technologies/senderid/wizard/

What is SPF records and How to setup?
http://www.kazeli.com/help/index.cfm?pageloc=quest&questid=435&catid=337,338

To diagnose the mail. Why its going in Spam.
Check tool:
http://mxtoolbox.com/
Here you can check following points
1. Mxlookup : For your domain and ip
2. Blacklist : For your IP
3. Diagnostics : SMTP Diagnostics, check your mail server
4. Analyze Headers : Check your mail headers.
5. SPF Records : Check your Sender Policy Framework
7. DNS Lookup : Check your Domain lookup.

If you check above all things your mail will not go in Spam.!

@Linux Administration Blog.!

Wednesday, May 16, 2012

ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number

mysql> GRANT SELECT ON *.* TO 'gita'@'localhost' IDENTIFIED BY PASSWORD "gita123";
ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number

# Check encripted password on Mysql Console.
mysql> select password('gita123');
+---------------------+
| password('gita123') |
+---------------------+
| 1f6f58c9269d50dc |
+---------------------+
1 row in set (0.00 sec)

# Check Grant for User
mysql> show grants for gita@192.168.10.143;
+-----------------------------------------------------------------------------------------------------+
| Grants for gita@192.168.10.143 |
+-----------------------------------------------------------------------------------------------------+
| GRANT SELECT, SHOW VIEW ON *.* TO 'gita'@'192.168.10.143' IDENTIFIED BY PASSWORD '1f6f58c9269d50dc' |
| GRANT SELECT, SHOW VIEW ON `data1`.* TO 'gita'@'192.168.10.143' |
| GRANT SELECT, SHOW VIEW ON `data2`.* TO 'gita'@'192.168.10.143' |
+-----------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

# Update Password In Query.

mysql> GRANT SELECT ON *.* TO 'gita'@'localhost' IDENTIFIED BY PASSWORD '1f6f58c9269d50dc';
Query OK, 0 rows affected (0.04 sec)


Resolved.!

Thursday, May 3, 2012

Auto Scaling On Amazon Cloud Computing.

First check the URL to understand Auto Scaling http://aws.amazon.com/autoscaling/
And download Auto Scaling developer tool http://aws.amazon.com/developertools/2535

After download follow the stapes:

unzip AutoScaling-2011-01-01.zip
cd AutoScaling-1.0.49.1/

Set the enviroment in /root/.bashrc on your box.
------------------------------------------------------------------------
export AWS_AUTO_SCALING_HOME=/opt/AutoScaling-1.0.49.1/
set AWS_AUTO_SCALING_HOME=/opt/AutoScaling-1.0.49.1/
export PATH=$PATH:$AWS_AUTO_SCALING_HOME/bin
set PATH=%AWS_AUTO_SCALING_HOME%/bin

export AWS_AUTO_SCALING_URL=https://autoscaling.ap-southeast-1.amazonaws.com
set AWS_AUTO_SCALING_URL=https://autoscaling.ap-southeast-1.amazonaws.com
------------------------------------------------------------------------

You need to be using an elastic load balancer to configure auto scaling. Configuring autoscaling consists of three steps:
1) Create launch configuration
2) Create auto scaling group
3) Create auto scaling trigger

Create launch configuration
Launch configuration provides information about the instance to be launched. You can see that an AMI, instance type, availability zone and security groups are specified when a launch configuration is created.

as-create-launch-config MY_Group --image-id ami-a2b7f3f0 --instance-type m1.small -I Your_access_key -S Your_Secret_key

Create autoscaling group
A launch configuration is attached with an autoscaling group. The group consists of pool of instances. You can specify minimum and maximum size of the pool.

as-create-auto-scaling-group sbsgroup --launch-configuration MY_Group --availability-zones ap-southeast-1b --min-size 1 --max-size 10 --desired-capacity 1 -I Your_access_key -S Your_Secret_key


To check
as-describe-auto-scaling-groups sbsgroup --headers -I Your_access_key -S Your_Secret_key
----------------------------------------------------------------
Output:
AUTO-SCALING-GROUP GROUP-NAME LAUNCH-CONFIG AVAILABILITY-ZONES MIN-SIZE MAX-SIZE DESIRED-CAPACITY
AUTO-SCALING-GROUP sbsgroup MY_Group ap-southeast-1b 1 10 1
INSTANCE INSTANCE-ID AVAILABILITY-ZONE STATE STATUS LAUNCH-CONFIG
INSTANCE i-e6d671b2 ap-southeast-1b InService Healthy MY_Group
-----------------------------------------------------------------

Create autoscaling trigger
The trigger defines the conditions to start or stop ec2 instances. For example:

as-create-or-update-trigger my-latency-trigger --auto-scaling-group sbsgroup --dimensions "LoadBalancerName=myloadbalancer" --measure Latency --period 60 --statistic Average --lower-threshold 0.25 --upper-threshold 0.75 --breach-duration 300 --lower-breach-increment=-1 --upper-breach-increment 1 --namespace "AWS/ELB" --unit Seconds

Now, we have created a latency trigger with 0.25 as the lower threshold and 0.75 seconds as the upper threshold. If your website latency goes beyond 0.75 seconds, this trigger will be activated and hence an instance will be launched (as specified by upper breach increment).

Its Done.! @ Linux Administration Blog.!

Monday, April 16, 2012

Use Delimiter In Awk and Cut.

We can use delimiter in Awk, if you exported domain list from godaddy and you want only domain name rather than full information then you can use this command to get domain list only.
Using this:

awk -F "," '{print $1}'

Or

cut '--delimiter= ' -f1

E.g.

cat DomainDownloadList-124696210.csv | awk '{ printf " %s\n", $1 }' | awk -F "," '{print $1}' > domainlist.txt
Or
cat DomainDownloadList-124696210.csv | cut '--delimiter= ' -f1 > domainlist.txt

For word count for counting domain :
cat DomainDownloadList-124696210.csv | awk '{ printf " %s\n", $1 }' | awk -F "," '{print $1}' | wc
Or
cat DomainDownloadList-124696210.csv | cut '--delimiter= ' -f1 | wc




@ Linux Administration Blog.! 

Tuesday, April 10, 2012

Monday, April 9, 2012

How to replicate only one table from mysql database.

Install Ruby 1.9.2
Install gem rubyrep (1.2.0) using command
gem install rubyrep

Then create conf file with name   /etc/myrubyrep.conf and with following content.
-------------------------------------------------------------
RR::Initializer::run do |config|
config.left = {
:adapter  => 'mysql', # or 'pgsql'
:database => 'c11',
:username => 'root',
:password => '',
:socket => '/var/lib/mysql/mysql.sock'
}

config.right = {
:adapter  => 'mysql', # or 'pgsql'
:database => 'c12',
:username => 'root',
:password => '',
:socket => '/var/lib/mysql/mysql.sock'
}

config.include_tables 'table name'  # e.g. 'email_list_subscribers' only this will replicate
#config.include_tables /^e/  # regexp matches all tables starting with e
# config.include_tables /./ # regexp matches all tables
#config.options[:auto_key_limit] = 2
end
---------------------------------------------

Using this command you can replicate only one table from database.

[root@localhost ]#  rubyrep replicate  -c /etc/myrubyrep.conf
Verifying RubyRep tables
Checking for and removing rubyrep triggers from unconfigured tables
Verifying rubyrep triggers of configured tables
Starting replication..

For only scan and sync to check status use following commands:

[root@localhost tmp]#  rubyrep scan   -c /etc/myrubyrep.conf
              email_list_subscribers 100% .........................   0

[root@localhost tmp]#  rubyrep sync  -c /etc/myrubyrep.conf
              email_list_subscribers 100% .........................   0

If modified it will change to 0 to 1.
Cool thing... Please let me know if you guys have any questions.
@ Linux Administration Blog.! 

Wednesday, January 11, 2012

Tuesday, January 3, 2012

SMTP check script in ruby.

Create ruby script to check SMTP with login credential.
You can test two authentication in this script i.e. plain and login.

vi     /opt/rubymailtest.rb


require 'net/smtp'

message = <
From: info@homework.do
To: sbtoalerts@gmail.com
Subject: test message
Date: Sat, 23 Jun 2001 16:26:43 +0900

This is a test message.
END_OF_MESSAGE


#Net::SMTP.start('mail.exmaple.com') do |smtp|
#  smtp.send_message message, 'info@homework.do',
#                             'sbtoalerts@gmail.com'


# PLAIN
#Net::SMTP.start('mail.example.com', 25, 'mail.example.com',
#                'Your Account', 'Your Password', :plain)
 

# LOGIN
Net::SMTP.start('mail.example.com', 25, 'mail.example.com', 'username', 'passwd', :login) do |smtp|
      smtp.send_message message, 'info@homework.do',
                             'sbtoalerts@gmail.com'


#puts " done"
end

Tuesday, October 11, 2011

Remove extra spaces from file in linux.

If you found spaces and non-ASCII characters with in files, remove all  from a file in place.

Solution is:
perl -i.bak -pe 's/[^[:ascii:]]//g' filename


Thanks-

Wednesday, September 28, 2011

My New Writeup.

I am not good writer, still i am writing things which is need to me and people who find needful for them. 

This is my another Tech Blog. I hope its useful for all of us.

Please visit: http://linux-fundamentals.blogspot.com/


Thanks-

Tuesday, September 27, 2011

Shell Script To Monitor Mysql.

[root@ 17_johnson]# cat /usr/bin/monitor-mysql
#!/bin/bash

# mysql root/admin username
MUSER="root"
# mysql admin/root password
MPASS="im#secure"
# mysql server hostname
MHOST="localhost"
#Shell script to start MySQL server i.e. path to MySQL daemon start/stop script.
# Debain uses following script, need to setup this according to your UNIX/Linux/BSD OS.
MSTART="/etc/init.d/mysqld start"
# Email ID to send notification
EMAILID="shrikant.lokhande@example.com, lokhande.shrikant@gmail.com"
# path to mail program
MAILCMD="$(which mail)"
# path mysqladmin
MADMIN="$(which mysqladmin)"

#### DO NOT CHANGE anything BELOW ####
MAILMESSAGE="/tmp/mysql.fail.$$"

# see if MySQL server is alive or not
# 2&1 could be better but i would like to keep it simple and easy to
# understand stuff :)
$MADMIN -h $MHOST -u $MUSER -p${MPASS} ping 2>/dev/null 1>/dev/null
if [ $? -ne 0 ]; then
        echo "" >$MAILMESSAGE
        echo "Error: MySQL Server is not running/responding ping request">>$MAILMESSAGE
        echo "Hostname: $(hostname)" >>$MAILMESSAGE
        echo "Date & Time: $(date)" >>$MAILMESSAGE
        # try to start mysql
        $MSTART>/dev/null
        # see if it is started or not
        o=$(ps cax | grep -c ' mysqld$')
        if [ $o -eq 1 ]; then
                sMess="MySQL Server MySQL server successfully restarted"
        else
                sMess="MySQL server FAILED to restart"
        fi
        # Email status too
        echo "Current Status: $sMess" >>$MAILMESSAGE
        echo "" >>$MAILMESSAGE
        echo "*** This email generated by $(basename $0) shell script ***" >>$MAILMESSAGE
        echo "*** Please don't reply this email, this is just notification email ***" >>$MAILMESSAGE
        # send email
        $MAILCMD -s "MySQL server" $EMAILID < $MAILMESSAGE
else # MySQL is running :) and do nothing
        :
fi
# remove file
rm -f $MAILMESSAGE

Saturday, September 24, 2011

Script To Check Disk Usage and Send Alert URGENT/WARNING.

[root@ 17_johnson]# cat /usr/bin/DiskUsage

#!/bin/bash


#filesystems="/dev/sda1 /dev/sda2 /dev/sda5"
filesystems="/data /log  /app  /backup  /home  /"

for fs in $filesystems
do

size=`df -k  $fs |grep $fs |awk '{ print  $3 }'`

        if [  $size  -le  2500000 ]  ;then
#                mail -b "URGENT: Low disk space for $fs ($size)"
 echo  "$fs ($size) URGENT" | mail -s "Alert: Disk Usage for Ishy  $fs ($size) " shrikant.lokhande@example.com
               echo "URGENT"
                break
        fi
        if [ $size -le  5000000 ] ;then
#                 mail -b "WARNING: Low disk space for $fs ($size)
   echo  "$fs ($size) WARNING" | mail -s "Alert: Disk Usage for Ishy(LOW)  $fs ($size) " shrikant.lokhande@example.com
               echo "WRANING"
fi
done

Friday, September 23, 2011

Shell script to taking MySql Dump/Backup.

[root@17_johnson]# cat /usr/bin/mybackupsql

#!/bin/bash
# USER VARIABLES
TIMESTAMP=$(date +%Y-%m-%d)
MYSQLUSER=root
MYSQLPWD=im#secure
MYSQLHOST=localhost
# PATH VARIABLES
MK=/bin/mkdir
GREP=/bin/grep
MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump
# CREATE MYSQL BACKUP
# Create new backup dir
$MK /backup/mysqlback_$TIMESTAMP
#Dump new files
for i in $(echo 'SHOW DATABASES;' | $MYSQL -u$MYSQLUSER -p$MYSQLPWD -h$MYSQLHOST|$GREP -v '^Database$'); do
  $MYSQLDUMP -u$MYSQLUSER -p$MYSQLPWD -h$MYSQLHOST $i >/backup/mysqlback_$TIMESTAMP/$i.sql
sleep 30
echo "$i"
done

Thursday, September 22, 2011

MysqlDump with Exclude database or perticuler table Options.

[root@linux_johnson]# cat /usr/bin/imdbbackup
#!/bin/bash
# USER VARIABLES
TIMESTAMP=$(date +%Y-%m-%d)
MYSQLUSER=root
MYSQLPWD=im#secure
MYSQLHOST=localhost
# PATH VARIABLES
MK=/bin/mkdir
GREP=/bin/grep
MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump
# CREATE MYSQL BACKUP
# Create new backup dir
$MK /backup/mysqlback_$TIMESTAMP
#Dump new files
DBname=db_production


for i in $(echo 'SHOW DATABASES;' | $MYSQL -u$MYSQLUSER -p$MYSQLPWD -h$MYSQLHOST|$GREP -v '^Database$'); do
if [ "$i" == "$DBname" ]; then
             echo " Dump taken"
  mysqldump  -u$MYSQLUSER -p$MYSQLPWD $DBname --ignore-table=db_production.clicks  --ignore-table=db_production.addresses  > /backup/mysqlback_$TIMESTAMP/$i.sql
else
  $MYSQLDUMP -u$MYSQLUSER -p$MYSQLPWD -h$MYSQLHOST $i >/backup/mysqlback_$TIMESTAMP/$i.sql
echo "$i"
fi

done

/etc/init.d/httpd reload




Wednesday, September 21, 2011

How To Clear Active record base Sessions.

[root@17_johnson]# cat current/lib/clear_sessions_data.rb

  require 'rubygems'
  require 'active_record'


  ActiveRecord::Base.establish_connection(
  :adapter => "mysql",
  :host => "localhost",
  :username => "root",
  :password =>"tm#secure",
  :database => "tm_production",
  :socket =>  "/var/lib/mysql/mysql.sock"
  )

 
  sql = 'DELETE FROM sessions WHERE updated_at < DATE_SUB(NOW(), INTERVAL 1 DAY);'
  ActiveRecord::Base.connection.execute(sql)

------------------
NOTE # Set script As cron at Every day 12.00 AM.

Tuesday, September 20, 2011

To check exact PID of running process in linux.

To check exact PID of process.
Command:
ps -efa  |  grep httpd | grep -v grep | awk '{print $2}'

-----------------------------------------------------------------------------------------
#! /bin/bash

PROCNAME=$1
PIDS=`ps -efa | grep $PROCNAME | grep -v grep | awk '{ print $2 }'`
for ff in $PIDS
do
echo "$ff"
done
------------------------------------------------------------------------------------------



do chmod 777 filename

Now  you can run the command like:
e.g.
filename httpd  or filename  processname.

Tuesday, September 13, 2011

Last_IO_Error: error connecting to master 'repl@12.18.46.78:3666' - retry-time: 10 retries: 86400

This error you get when you check " show slave status\G;"

Solution as follows:
Do Telnet:

[root@sj ~]# telnet 12.18.46.78 3666
Trying 12.18.46.78...
Connected to 12.18.46.78.
Escape character is '^]'.
uHost '12.18.46.78' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'Connection closed by foreign host.

Do Flush host:

[root@sj ~]# mysqladmin -uroot -ppassword flush-hosts

Lets check " show slave status\G;" again.

Done.

Wednesday, August 24, 2011

start-stop-daemon script for Centos 5.!

 wget http://developer.axis.com/download/distribution/apps-sys-utils-start-stop-daemon-IR1_9_18-2.tar.gz

tar -xvf apps-sys-utils-start-stop-daemon-IR1_9_18-2.tar.gz
cd apps
cd sys-utils/start-stop-daemon-IR1_9_18-2/

cat Makefile
---------------------------------------------
# comment this Two line for centos build.
#AXIS_USABLE_LIBS = GLIBC UCLIBC
#include $(AXIS_TOP_DIR)/tools/build/Rules.axis

PROG = start-stop-daemon

all: $(PROG)

install: all
        $(INSTALL) -m 0755 -o root -g root $(PROG) $(prefix)/sbin

clean:
        rm -f $(PROG)
-----------------------------------------------

-bash-3.2# make
cc     start-stop-daemon.c   -o start-stop-daemon
-bash-3.2# ls
a.out  Makefile  start-stop-daemon  start-stop-daemon.c

* Copy the daemon to bin path:
cp start-stop-daemon /usr/bin/

* How to Use this script Please see.
http://svn.ez.no/svn/extensions/ezfind/ezp4/trunk/extension/ezfind/bin/scripts/gentoo/solr

Monday, June 20, 2011

Add Branch to Git.

--------------------------------------------------------
vi  /usr/bin/addbranch   <---Create the file with name, and copy the following code.

#!/bin/bash
# git-create-branch

if [ $# -ne 1 ]; then
         echo 1>&2 Usage: $0 branch_name
         exit 127
fi

set branch_name = $1
#git push origin origin:refs/heads/${branch_name}
#git fetch origin
git checkout --track -b ${branch_name} origin/${branch_name}
git pull

--------------------------------------------------------------




Do
chmod 777 /usr/bin/addbranch


and create new branch like:
from checkouted code.

addbranch

Monday, May 30, 2011

Find Command in Linux With Options.

If you find root only
find /. -size +100M

-size n[cwbkMG]
              File uses n units of space.  The following suffixes can be used:

              ‘b’    for 512-byte blocks (this is the default if no suffix is used)

              ‘c’    for bytes

              ‘w’    for two-byte words

              ‘k’    for Kilobytes (units of 1024 bytes)

              ‘M’    for Megabytes (units of 1048576 bytes)

              ‘G’    for Gigabytes (units of 1073741824 bytes)

              The size does not count indirect blocks, but it does count blocks in sparse  files  that  are  not
              actually  allocated.   Bear  in  mind  that  the ‘%k’ and ‘%b’ format specifiers of -printf handle
              sparse files differently.  The ‘b’ suffix always denotes 512-byte  blocks  and  never  1  Kilobyte
              blocks, which is different to the behaviour of -ls.

       -true  Always true.

If you want to find in perticuler other directory.

find /usr/local/ -size +100M  
find /var/ -size +100M
find /mnt/ -size +100M
find /opt/ -size +100M

Daywise find.file modified 6 days ago.
find /var/ -mtime 6

Show all files which is modified with in 24 hours.
find /.  -atime +1


   TESTS
       Numeric arguments can be specified as

       +n     for greater than n,

       -n     for less than n,

       n      for exactly n.

       -amin n
              File was last accessed n minutes ago.

       -anewer file
              File  was  last accessed more recently than file was modified.  If file is a symbolic link and the
              -H option or the -L option is in effect, the access time of the file it points to is always  used.

       -atime n
              File  was  last  accessed  n*24 hours ago.  When find figures out how many 24-hour periods ago the
              file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to  have
              been accessed at least two days ago.

       -cmin n
              File’s status was last changed n minutes ago.

       -cnewer file
              File’s  status  was last changed more recently than file was modified.  If file is a symbolic link
              and the -H option or the -L option is in effect, the status-change time of the file it  points  to
              is always used.

       -ctime n
              File’s  status  was  last  changed  n*24 hours ago.  See the comments for -atime to understand how
              rounding affects the interpretation of file status change times.

       -empty File is empty and is either a regular file or a directory.

       -false Always false.

       -fstype type
              File is on a filesystem of type type.  The valid filesystem types vary among different versions of
              Unix;  an incomplete list of filesystem types that are accepted on some version of Unix or another
 -ilname pattern
              Like  -lname,  but  the  match  is case insensitive.  If the -L option or the -follow option is in
              effect, this test returns false unless the symbolic link is broken.

       -iname pattern
              Like -name, but the match is case insensitive.  For example, the patterns ‘fo*’  and  ‘F??’  match
              the  file names ‘Foo’, ‘FOO’, ‘foo’, ‘fOo’, etc.   In these patterns, unlike filename expansion by
              the shell, an initial ’.’ can be matched by ’*’.  That is, find -name *bar  will  match  the  file
              ‘.foobar’.   Please note that you should quote patterns as a matter of course, otherwise the shell
              will expand any wildcard characters in them.

       -inum n
              File has inode number n.  It is normally easier to use the -samefile test instead.

       -ipath pattern
              Behaves in the same way as -iwholename.  This option is deprecated, so please do not use it.

       -iregex pattern
              Like -regex, but the match is case insensitive.

       -iwholename pattern
              Like -wholename, but the match is case insensitive.

       -links n
              File has n links.

       -lname pattern
              File is a symbolic link whose contents match shell pattern pattern.   The  metacharacters  do  not
              treat  ‘/’  or  ‘.’  specially.   If  the  -L option or the -follow option is in effect, this test
              returns false unless the symbolic link is broken.

 -lname pattern
              File is a symbolic link whose contents match shell pattern pattern.   The  metacharacters  do  not
              treat  ‘/’  or  ‘.’  specially.   If  the  -L option or the -follow option is in effect, this test
              returns false unless the symbolic link is broken.

       -mmin n
              File’s data was last modified n minutes ago.

       -mtime n
              File’s data was last modified n*24 hours ago.  See the  comments  for  -atime  to  understand  how
              rounding affects the interpretation of file modification times.

       -name pattern
              Base  of  file name (the path with the leading directories removed) matches shell pattern pattern.
              The metacharacters (‘*’, ‘?’, and ‘[]’) match a ‘.’ at the start of  the  base  name  (this  is  a
              change  in  findutils-4.2.2;  see section STANDARDS CONFORMANCE below).  To ignore a directory and
              the files under it, use -prune; see an example in the description of -wholename.  Braces  are  not
              recognised  as being special, despite the fact that some shells including Bash imbue braces with a
              special meaning in shell patterns.  The filename  matching  is  performed  with  the  use  of  the
              fnmatch(3)  library  function.   Don’t forget to enclose the pattern in quotes in order to protect
              it from expansion by the shell.

       -newer file
              File was modified more recently than file.  If file is a symbolic link and the -H option or the -L
              option is in effect, the modification time of the file it points to is always used.

       -nouser
              No user corresponds to file’s numeric user ID.

       -nogroup
              No group corresponds to file’s numeric group ID.

       -path pattern
              See -wholename.   The predicate -path is also supported by HP-UX find.

       -perm mode
              File’s permission bits are exactly mode (octal or symbolic).  Since an exact match is required, if
              you want to use this form for symbolic modes, you may  have  to  specify  a  rather  complex  mode
              string.   For  example  ’-perm  g=w’ will only match files which have mode 0020 (that is, ones for
              which group write permission is the only permission set).  It is more likely that you will want to
              use  the  ’/’ or ’-’ forms, for example ’-perm -g=w’, which matches any file with group write per-
: