0


実験を自動化するスクリプトを作成しようとしています。
私の目的は、サーバー上で別のスクリプトを実行するシェル スクリプトから次のようなコマンドを実行することです。

ssh root@server.com 'sh ControlIperfServer.sh start'

ファイル ControlIperfServer.sh はすでに server.com の /root ディレクトリに配置されていますが、ターミナルからの出力は次のとおりです。

bash: sh ControlIperfServer.sh start: command not found

ターミナルに入力すると、そのコマンドを実行できましたが。スクリプトから実行する場合のみ実行できません。

つまり
、ターミナルでコマンドを入力したときです。できます。

[root@CentOSVanilla ~]# ssh root@server.com 'sh ControlIperfServer.sh start'
Running IPERF SERVER
[root@CentOSVanilla ~]# 

スクリプトにコマンドを入れてスクリプトを実行すると。それは動作しません。

[root@CentOSVanilla ~]# ./Runtest.sh
bash: sh ControlIperfServer.sh start: command not found
[root@CentOSVanilla ~]#

詳細な -v オプションを使用して追跡しました

debug1: Next authentication method: publickey
debug1: Trying private key: /root/.ssh/identity
debug1: Offering public key: /root/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
debug1: Sending env LC_CTYPE = UTF-8
debug1: Sending command: 'sh ControlIperfServer.sh start;'
bash: sh ControlIperfServer.sh start;: command not found
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0
debug1: channel 0: free: client-session, nchannels 1
Transferred: sent 2352, received 2360 bytes, in 0.2 seconds
Bytes per second: sent 10829.0, received 10865.9
debug1: Exit status 127

大変お世話になりました。

Runtest.sh のコードを追加します。

#!/bin/sh
# A script to run test automatically, need modify when using
# Usage:
#       ./RunTest.sh <number of test> [threads]
#       [threads]: when there is threads, use -P option of Iperf
#                  Otherwise, run multiple instances of Iperf
#       <number of test>: Defaut is 1
#                         Number of Threads/Processes
#                         Number of time capture traffic
RUN_IPERF_SERVER="sh ControlIperfServer.sh start"
STOP_IPERF_SERVER="sh ControlIperfServer.sh stop"
RUN_TCPDUMP="sh ControlTCPdump.sh start"
STOP_TCPDUMP="sh ControlTCPdump.sh stop"
RUN_CLIENT="iperf -c"
TARGET_SERVER="10.10.10.253"
REMOTE_SERVER="server.com"
DIRECTORY="CaptureTraffic"
TCP_DURATION="60"

if [ "$1" = "" ]; then
    MAX_TEST=1;
else
    MAX_TEST=$1;
fi

# Run server daemon on remote server
CMD="ssh -v root@$REMOTE_SERVER \"$RUN_IPERF_SERVER\""
echo Running $CMD
$CMD # Run iperf server remotely
sleep 5 # Waiting for server to run

CMD="ssh -v $REMOTE_SERVER 'mkdir $DIRECTORY && echo ok'"
DIROK="$($CMD)"
if [ "$DIROK" = ok ]; then
    mkdir $DIRECTORY
else
    echo Cannot create directory\! Please be careful\!
fi

for INCR in $(seq 1 $MAX_TEST)
do
    echo Running Test $INCR

    #Prepare TCP to capture traffic (run on host)
    echo Setting-up TCPdump for capture traffic
    FILENAME="$DIRECTORY/CapturedTraffic$INCR.dmp"
    ssh $REMOTE_SERVER \'$RUN_TCPDUMP $FILENAME\'
    sleep 5

    # Running the client (running locally)
    if [ "$2" = threads ]; then
        echo "Running Iperf Client as threads model"
        $RUN_CLIENT $TARGET_SERVER -t $TCP_DURATION -P $INCR
    else
        echo "Running Iperf Client as processes model"
        sh parallel.sh -j $INCR \"$RUN_CLIENT $TARGET_SERVER -t $TCP_DURATION\"
    fi

    #Stop TCPdump (run on host)
    ssh $REMOTE_SERVER '$STOP_TCPDUMP'    
    sleep 5 #Wait for TCPdump write file to harddrive

done

#Stop Iperf Deamon
ssh $REMOTE_SERVER '$STOP_IPERF_SERVER'
sleep 3

「server.com」という名前のホストにすべてのスクリプト ファイルを配置しました。

4

3 に答える 3

4

これ

CMD="ssh -v root@$REMOTE_SERVER \"$RUN_IPERF_SERVER\""

悪い考えです。に埋め込まれた引用符CMDは、文字通りの引用符として扱われます。の空白を保護するためだけに使用されるわけではありませんRUN_IPERF_SERVER。コマンドの名前を変数に入れることは問題ありませんが、その引数は分けておく必要があります。bash(または配列をサポートする他のシェル)を使用している場合は、お勧めします

CMD=ssh
CMD_OPTIONS=( -v root@REMOTE_SERVER "$RUN_IPERF_SERVER" )
$CMD "${CMD_OPTIONS[@]}"

配列を使用できない場合は、次の使用にフォールバックできますeval

CMD="ssh -v root@$REMOTE_SERVER \"$RUN_IPERF_SERVER\""
eval "$CMD"

しかし、私はこれをお勧めします

CMD=ssh
CMD_OPTIONS="-v root@REMOTE_SERVER"  # Note no whitespace to protect
$CMD $CMD_OPTIONS "$REMOTE_IPERF_SERVER"
于 2013-03-20T17:15:27.080 に答える
0

「sh ControlIperfServer.sh start」がコマンドだと思っているようです。1 つのファイル。引数を持つファイルではありません。' \' のようなエスケープを試して修正してください。

./ControlIperfServer.sh または /root/ControlIperfServer.sh も使用します。ルートのシェルには「.」を含めないでください。セキュリティ上の理由からそのパスにあるため、そこにあるとは考えないでください。

于 2013-03-20T17:00:38.710 に答える
-2

sh の代わりに /bin/sh を試してみてください。スクリプトから ssh を呼び出すと、エイリアスが読み込まれないことがあります。

于 2013-03-20T17:04:32.173 に答える