Удалить первую строку / символы в Windows Pipe - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь записать живой tcpdump из специально разработанной системы linux. Пока что я использую команду:

plink.exe -ssh user@IP -pw PW "shell nstcpdump.sh -s0 -U -w - not port 22 and not host 127.0.0.1" | "C:\Program Files\Wireshark\wireshark" -i -

Это не удастся, поскольку при выполнении команды в удаленной системе эта (пользовательская) оболочка выведет «Done» перед отправкой данных. Я попытался найти способ удалить сообщение «Готово» из оболочки, но, похоже, его нет.



Итак, я придумал это (добавил findstr -V):

plink.exe -ssh user@IP -pw PW "shell nstcpdump.sh -s0 -U -w - not port 22 and not host 127.0.0.1" | findstr -V "Done" | "C:\Program Files\Wireshark\wireshark" -i -

Это работает более или менее нормально, так как я получу некоторые ошибки, и запись в реальном времени остановится. Я полагаю, что это может иметь какое-то отношение к буферам, но я не уверен.


Кто-нибудь знает какой-либо другой метод удаления / обхода первых байтов / символов вывода из plink / remote shell?

[править] как и было сказано, nstcpdump.sh - это оболочка для tcpdump. как уже упоминалось ранее, эта система сильно настроена. Код nstcpdump.sh:

root@hostname# cat /netscaler/nstcpdump.sh
#!/bin/sh
# piping the packet trace to the tcpdump
#
# FILE:         $Id: //depot/main/rs_120_56_14_RTM/usr.src/netscaler/scripts/nstcpdump.sh#1 $
# LAST CHECKIN: $Author: build $
#               $DateTime: 2017/11/30 02:14:38 $
#
#
# Options:      any TCPDUMP options
#
TCPDUMP_PIPE=/var/tmp/tcpdump_pipe

NETSCALER=${NETSCALER:-`cat /var/run/.NETSCALER`}
[ -r ${NETSCALER}/netscaler.conf ] && . ${NETSCALER}/netscaler.conf

TIME=${TIME:-3600}
MODE=${MODE:-6}
STARTCMD="start nstrace -size 0 -traceformat PCAP -merge ONTHEFLY -filetype PIPE -skipLocalSSH ENABLED"
STOPCMD="stop nstrace "
SHOWCMD="show nstrace "
NSCLI_FILE_EXEC=/netscaler/nscli
NSTRACE_OUT_FILE=/tmp/nstrace.out
NS_STARTTRACE_PIDFILE=/tmp/nstcpdump.pid
TRACESTATE=$(nsapimgr -d allvariables | grep tracestate | awk '{ print $2}')

trap nstcpdump_exit 1 2 15

nstcpdump_init()
{
        echo "##### WARNING #####"
        echo "This command has been deprecated."
        echo "Please use 'start nstrace...' command from CLI to capture nstrace."
        echo "trace will now start with all default options"
        echo "###################"
        if [ ! -d $NSTRACE_DIR ]
        then
                echo "$NSTRACE_DIR directory doesn't exist."
                echo "Possible reason: partition is not mounted."
                echo "Check partitions using mount program and try again."
                exit 1
        fi

        if [ ! -x $NSCLI_FILE_EXEC ]
        then
                echo "$NSCLI_FILE_EXEC binary doesn't exist"
                exit 1
        fi

        if [ -e $NSTRACE_OUT_FILE ]
        then
                rm $NSTRACE_OUT_FILE
                echo "" >> $NSTRACE_OUT_FILE
        fi

}
nstcpdump_start_petrace()
{
        sleep 0.5;
        $NSCLI_FILE_EXEC -U %%:.:. $STARTCMD >/tmp/nstcpdump.sh.out
        rm -f ${NS_STARTTRACE_PIDFILE}
}

nstcpdump_start()
{
        # exit if trace is already running
        if [ $TRACESTATE -ne 0 ]
        then
                echo "Error: one instance of nstrace is already running"
                exit 2
        fi

        nstcpdump_start_petrace &
        echo $! > ${NS_STARTTRACE_PIDFILE}
        tcpdump  -n -r - $TCPDUMPOPTIONS < ${TCPDUMP_PIPE}
        nstcpdump_exit
        exit 1
}

nstcpdump_exit()
{
        if [ -f ${NS_STARTTRACE_PIDFILE} ]
        then
                kill `cat ${NS_STARTTRACE_PIDFILE}`
                rm ${NS_STARTTRACE_PIDFILE}
        fi

        $NSCLI_FILE_EXEC -U %%:.:. $STOPCMD >> /dev/null
        exit 1
}

nstcpdump_usage()
{
        echo `basename $0`: utility to view/save/sniff LIVE packet capture on NETSCALER box
        tcpdump -h
        echo
        echo NOTE: tcpdump options -i, -r and -F are NOT SUPPORTED by this utility
        exit 0
}

########################################################################

while [ $# -gt 0 ]
do
        case "$1" in
        -h )
                nstcpdump_usage
                ;;
        -i )
                nstcpdump_usage
                ;;
        -r )
                nstcpdump_usage
                ;;
        -F )
                nstcpdump_usage
                ;;
        esac
        break;
done

TCPDUMPOPTIONS="$@"
check_ns nstcpdump
#nstcpdump_init
#set -e
if [ ! -e ${TCPDUMP_PIPE} ]
then
        mkfifo $TCPDUMP_PIPE
        if [ $? -ne 0 ]
        then
                echo "Failed creating pipe [$TCPDUMP_PIPE]"
                exit 1;
        fi
fi

nstcpdump_start

Привет

...