Bash cheatsheet: Difference between revisions

From Lolly's Wiki
Jump to navigationJump to search
No edit summary
No edit summary
Line 110: Line 110:




=Rechnen=
=Calculations=
  $ echo $[ 3 + 4 ]   
  $ echo $[ 3 + 4 ]   
  $ echo $[ 2 ** 8 ] # 2^8
  $ echo $[ 2 ** 8 ] # 2^8
=init scripts=
==A basic skeleton==
<source lang=bash>
#!/bin/bash
NAME=<myname>  # The name of the daemon
USER=<runuser> # The user to run the daemon as
SELF=${0##*/}
CALLER=$(id -nu)
# Check if called as ${USER}
if [ "_${CALLER}_" != "_${USER}_" ]
then
  # If not do a su if called as root
  if [ "_${CALLER}_" == "_root_" ]
  then
    exec su -l ${USER} -c "$0 $@"
  else
    echo "Please start this script only as user ${USER}"
    exit 1
  fi
fi
if [ $# -eq 1 ]
then
  command=$1
else
  # Called as ${NAME}-start.sh or ${NAME}-stop.sh
  command=${SELF%.sh}
  command=${command##${NAME}-}
  [ "_${command}_" == "_${NAME}_" ] && command=""
fi
case ${command} in
start)
  # start commands
  ;;
stop)
  # stop commands
  ;;
restart)
  $0 stop
  $0 start
  ;;
*)
  [ ! -z "${command}" ] && echo "ERROR: Unknown option ${command}!"
  echo "Usage: $0 (start|stop|restart)";
  echo "Or call as ${NAME}-(start|stop|restart).sh"
  exit 1
  ;;
esac
</source>

Revision as of 14:22, 12 May 2016

Kategorie:Bash

bash history per user

You need to set LogLevel of sshd to VERBOSE in your /etc/ssh/sshd_config:

...
LogLevel VERBOSE
...

If you are using ssh public keys for authenticating and want to use a seperate history for each user, you can put this in your .bash_profile:

[ -f /var/log/fingerprint.log ] && FINGERPRINT=$(nawk -v ssh_connection="${SSH_CONNECTION}" -v user=${LOGNAME} 'BEGIN{split(ssh_connection,connection)}/.*sshd\[[0-9]+\]: Accepted publickey for/ && $(NF-5)==connection[1] && $(NF-3)==connection[2] {print $NF;}' /var/log/fingerprint.log)

export HISTFILE=~/.bash_history_${FINGERPRINT:-${SUDO_USER:-default}}

If $FINGERPRINT is empty the sudo user will be used. If $SUDO_USER is empty too, use "default" as extension.

I forced rsyslog to write another logfile where group ssh may read: /etc/rsyslog.d/99-fingerprint.conf:

$FileCreateMode 0640
$FileGroup ssh
auth                 /var/log/fingerprint.log

Add user syslog to group ssh so that syslog can open a file as group ssh:

# usermod -aG ssh syslog

Let only users from group ssh login via ssh except the syslog user: /etc/ssh/sshd_config:

# SSH is only allowed for users in this group
AllowGroups ssh
DenyUsers syslog

bash prompt

Put this in your ~/.bash_profile

typeset +x PS1="\[\e]0;\u@\h: \w\a\]\u@\h:\w# "

Nützliche Variablenersetzungen

dirname

$ myself=/usr/bin/blafasel ; echo ${myself%/*} 
/usr/bin

basename

$ myself=/usr/bin/blafasel ; echo ${myself##*/} 
blafasel

Path name resolving function

# dir_resolve originally from  http://stackoverflow.com/a/20901614/5887626
# modified at https://lars.timmann.de/wiki/index.php/Bash_cheatsheet
dir_resolve() {
  local dir=${1%/*}
  local file=${1##*/}
  # if the name does not contain a / leave file blank or the name will be name/name
  [ "_${1/\//}_" == "_${1}_" -a -d ${1} ] && file=""
  [ "_${1/\//}_" == "_${1}_" -a -f ${1} ] && dir=""
  pushd "$dir" &>/dev/null || return $? # On error, return error code
  echo ${PWD}${file:+"/"${file}} # output full path with filename
  popd &> /dev/null
}

Schleifen

Zahlenfolgen

$ for i in {0..9} ; do echo $i ; done

oder

$ for ((i=0;i<=9;i++)); do echo $i; done

so gehen natürlich auch andere Sprünge, z.B. immer 3 weiter:

$ for ((i=0;i<=9;i+=3)); do echo $i; done

oder oder oder

$ for ((i=0,j=1;i<=9;i+=3,j++)); do echo "$i $j"; done


Exit controlled loop

Just put your code between while and do and use continue alias : in the loop.

#!/bin/bash
while
  # some code
  (( <your control expression> ))
do
  :
done

For example:

#!/bin/bash

i=1
while
  i=$[ $i + 1 ];
  (( $i < 10 ))
do
  :
done


Calculations

$ echo $[ 3 + 4 ]  
$ echo $[ 2 ** 8 ] # 2^8

init scripts

A basic skeleton

#!/bin/bash

NAME=<myname>  # The name of the daemon
USER=<runuser> # The user to run the daemon as

SELF=${0##*/}
CALLER=$(id -nu)

# Check if called as ${USER}
if [ "_${CALLER}_" != "_${USER}_" ]
then
  # If not do a su if called as root
  if [ "_${CALLER}_" == "_root_" ]
  then
    exec su -l ${USER} -c "$0 $@"
  else
    echo "Please start this script only as user ${USER}"
    exit 1
  fi
fi


if [ $# -eq 1 ]
then
  command=$1
else
  # Called as ${NAME}-start.sh or ${NAME}-stop.sh
  command=${SELF%.sh}
  command=${command##${NAME}-}
  [ "_${command}_" == "_${NAME}_" ] && command=""
fi

case ${command} in
start)
  # start commands
  ;;
stop)
  # stop commands
  ;;
restart)
  $0 stop
  $0 start
  ;;
*)
  [ ! -z "${command}" ] && echo "ERROR: Unknown option ${command}!"
  echo "Usage: $0 (start|stop|restart)";
  echo "Or call as ${NAME}-(start|stop|restart).sh"
  exit 1
  ;;
esac