2017-02-22 2 views
0

есть некоторые проблемы с скриптом оболочки.Невозможно разобрать строку с операциями расширения скобок в команде

В нашем офисе мы создали только несколько команд, которые доступны для разработчиков, когда они пытаются 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 

может кто-нибудь помочь мне, как я могу разобрать \ подсчитывать аргументы команды, чтобы заставить его работать? Спасибо, у меня хороший день!

+2

Можете ли вы сузить вопрос только до той части, которая не работает? И как бы вы хотели, чтобы это было исправлено? – Inian

+0

любая команда не работает с {} соответствующим образом. –

+2

То, что вы сейчас делаете, просто * неправильно *, во многих отношениях, выходящих далеко за пределы вашего вопроса. 'set $ SSH_ORIGINAL_COMMAND', например, не делает того, что вы хотите, чтобы он делал - если SSH_ORIGINAL_COMMAND содержит« привет »жестокий мир», то вы получите ** три ** аргумента, первый из которых содержит «привет» , второй - «жестокий», а третий - «мир». –

ответ

0

Меньше команда работает в настоящее время:

case "$COMMAND" in 
    less) 
     if [[ $ARGU1 == "" ]]; then 
       echo "Pls give a filename" 
       exit 1 
     fi 
     FILES_LIST=${@:2} 
     FILE=(${FILES_LIST//\.\./}) 
     for v in "${FILE[@]}";do 
       v=${v//[;\']/} 
       if [ ! -f $v ]; then 
         echo "File doesn't exist" 
       fi 
       /usr/bin/less $PATH/$v 
     done;; 

команда хвост тоже работает с 2-мя и более файлов, но я не могу выполнить хвост -f команду на двух файлах, к сожалению.

0

Число аргументов для сценария bash будет $#. Как простой пример:

#!/bin/bash 
narg=$# 
typeset -i i 
i=1 

while [ $i -le $narg ] ; do 
    echo " $# $i: $1" 
    shift 
    i=$i+1 
done 

дает, для bash tst.sh a b {c,d}

4 1: a 
3 2: b 
2 3: c 
1 4: d 

В вашем сценарии, команда для выполнения (кошки, меньше, ...) получает явно только второй аргумент сценария. Если вы хотите, чтобы прочитать все аргументы, вы должны сделать что-то вроде этого (примечание: только намек, удалены все виды проверок и т.д ..)

command="$1" 
shift 
case $command in 
(grep) pattern="$1" 
     shift 
     while [ $# -gt 0 ] ; do 
      grep "$pattern" "$1" 
      shift 
     done 
     ;; 
esac 

примечание: добавлены некоторые цитаты, как комментарий предложил, но, будучи только подсказку, вы должны внимательно посмотреть на цитаты и свои проверки в своем собственном сценарии.

+0

Требуется больше кавычек. 'grep" $ pattern "" $ 1 "', по крайней мере. –

Смежные вопросы