есть некоторые проблемы с скриптом оболочки.Невозможно разобрать строку с операциями расширения скобок в команде
В нашем офисе мы создали только несколько команд, которые доступны для разработчиков, когда они пытаются ssh на сервер. Он настраивается с помощью файла .ssh/authorized_keys и доступна команда для пользователя есть Баш скрипт:
#!/bin/sh
if [[ $1 == "--help" ]]; then
cat <<"EOF"
This script has the purpose to let people remote execute certain commands without logging into the system.
For this they NEED to have a homedir on this system and uploaded their RSA public key to .ssh/authorized_keys (via ssh-copy-id)
Then you can alter that file and add some commands in front of their key eg :
command="/usr/bin/dev.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty
The user will do the following : ssh [email protected] tail testserver.example.com/2017/01/01/user.log
EOF
exit 0;
fi
# set global variable
set $SSH_ORIGINAL_COMMAND
# set the syslog path where the files can be found
PATH="/opt/syslog/logs"
# strip ; or any other unwanted signs out of the command, this prevents them from breaking out of the setup command
if [[ $1 != "" ]]; then
COMMAND=$1
COMMAND=${COMMAND//[;\`]/}
fi
if [[ $2 != "" ]]; then
ARGU1=$2
ARGU1=${ARGU1//[;\`]/}
fi
if [[ $3 != "" ]]; then
ARGU2=$3
ARGU2=${ARGU2//[;\`]/}
fi
if [[ $4 != "" ]]; then
ARGU3=$4
ARGU3=${ARGU3//[;\`]/}
fi
# checking for the commands
case "$COMMAND" in
less)
ARGU2=${ARGU1//\.\./}
FILE=$PATH/$ARGU1
if [ ! -f $FILE ]; then
echo "File doesn't exist"
exit 1;
fi
#echo " --------------------------------- LESS $FILE"
/usr/bin/less $FILE
;;
grep)
if [[ $ARGU2 == "" ]]; then
echo "Pls give a filename"
exit 1
fi
if [[ $ARGU1 == "" ]]; then
echo "Pls give a string to search for"
exit 1
fi
ARGU2=${ARGU2//\.\./}
FILE=$PATH/$ARGU2
/usr/bin/logger -t restricted-command -- "------- $USER Executing grep $ARGU1 \"$ARGU2\" $FILE"
if [ ! -f $FILE ]; then
echo "File doesn't exist"
/usr/bin/logger -t restricted-command -- "$USER Executing [email protected]"
exit 1;
fi
/bin/grep $ARGU1 $FILE
;;
tail)
if [[ $ARGU1 == "" ]]; then
echo "Pls give a filename"
exit 1
fi
ARGU1=${ARGU1//\.\./}
FILE=$PATH/$ARGU1
if [ ! -f $FILE ]; then
echo "File doesn't exist"
/usr/bin/logger -t restricted-command -- "$USER Executing [email protected] ($FILE)"
exit 1;
fi
/usr/bin/tail -f $FILE
;;
cat)
ARGU2=${ARGU1//\.\./}
FILE=$PATH/$ARGU1
if [ ! -f $FILE ]; then
echo "File doesn't exist"
exit 1;
fi
/bin/cat $FILE
;;
help)
/bin/cat <<"EOF"
# less LOGNAME (eg less testserver.example.com/YYYY/MM/DD/logfile.log)
# grep [ARGUMENT] LOGNAME
# tail LOGNAME (eg tail testserver.example.com/YYYY/MM/DD/logfile.log)
# cat LOGNAME (eg cat testserver.example.com/YYYY/MM/DD/logfile.log)
In total the command looks like this : ssh [email protected] COMMAND [ARGUMENT] LOGFILE
EOF
/usr/bin/logger -t restricted-command -- "$USER HELP requested [email protected]"
exit 1
;;
*)
/usr/bin/logger -s -t restricted-command -- "$USER Invalid command [email protected]"
exit 1
;;
esac
/usr/bin/logger -t restricted-command -- "$USER Executing [email protected]"
Проблема заключается в следующем: , когда я пытаюсь EXEC какую-либо команду, он принимает только первый аргумент, если г сделать рекурсию в файлах с помощью {п, n1, n2} - это не работает:
[[email protected] ~]$ ssh [email protected] less srv1838.example.com/2017/02/10/local1.log |grep 'srv2010' | wc -l
0
[[email protected] ~]$ ssh [email protected] less srv2010.example.com/2017/02/10/local1.log |grep 'srv2010' | wc -l
11591
[[email protected] ~]$ ssh [email protected] less srv{1838,2010}.example.com/2017/02/10/local1.log |grep 'srv2010' | wc -l
0
[[email protected] ~]$ ssh [email protected] less srv{2010,1838}.example.com/2017/02/21/local1.log |grep 'srv2010' | wc -l
11591
может кто-нибудь помочь мне, как я могу разобрать \ подсчитывать аргументы команды, чтобы заставить его работать? Спасибо, у меня хороший день!
Можете ли вы сузить вопрос только до той части, которая не работает? И как бы вы хотели, чтобы это было исправлено? – Inian
любая команда не работает с {} соответствующим образом. –
То, что вы сейчас делаете, просто * неправильно *, во многих отношениях, выходящих далеко за пределы вашего вопроса. 'set $ SSH_ORIGINAL_COMMAND', например, не делает того, что вы хотите, чтобы он делал - если SSH_ORIGINAL_COMMAND содержит« привет »жестокий мир», то вы получите ** три ** аргумента, первый из которых содержит «привет» , второй - «жестокий», а третий - «мир». –