Как я могу получить обычные символы между двумя строками

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

Однако, если в пути между SSH-клиентом и SSH есть какая-либо медицинская королярная коробка. Это означает, что вам нужно сделать дополнительную помощь, если на пути на пути есть NAT или брандмауэр.

Сообщения Keepalive могут предотвратить умирание соединения из-за тайм-аута. Они не будут препятствовать смерти связи из-за других причин, таких как перезапущенные ближневые коробки, но в тех случаях, когда keepalive может обнаружить, что оно произошло, и убедившись, что связь сразу же умирает, а не вытесняется.

На клиенте вы можете использовать -O ServerAliveInterval = 299 или что-то похожее на отправку Keepalives и убедитесь, что команда SSH вскоре завершится в случае завершения соединения. Оборачивая, что в сценарии петли Shell можно убедиться, что он будет продолжать открывать новое соединение SSH каждый раз, когда предыдущее соединение умирает (но, очевидно, потребует скрипта на вилку, а не команду ssh).

Если вы хотите сохранить переадресацию порта, открытым с -L -L , затем ServerAliveInterval и RespaWning SSH-команда будет достаточным. Но с -R есть другая вещь, которая может пойти не так.

Если что-либо уже прослушивает на порте на сервере, то -R -R не удастся настроить переадресацию портов, но команда SSH будет продолжать работать в любом случае. Таким образом, цикл, предназначенный для возрождения команды SSH, не будет хорошо в этом случае.

Исправление для этого - это пропустить -O EXITONFORDARDFAILURE = YES в команду ssh. Очевидно, что если вы просто запустите SSH в цикле с этой комбинацией флагов, он может попытаться много раз в ряд привязать к тому же занятому порту. Таким образом, сон между последовательными попытками будет очень хорошая идея. Каждый раз, когда команда SSH умирает, ваш скрипт должен просто спать несколько секунд, прежде чем снова попробовать.

Я был бы удивлен, если бы не уже не существовали несколько скриптов, которые делают все, что я описал выше.

То, что я упомянул до сих пор, не покрывает все необходимое.

Если соединение пробивает и клиент уведомляют и попытайтесь вернуться команду SSH, сервер еще не заметил, при этом порт все еще может быть занят на стороне сервера. В случае, если кто-то настроил брандмауэр глупым способом, эта проблема неограниченно сохраняется с помощью скрипта на клиенте, которые неоднократно пытаются связывать с портом, который остается заблокированным.

Так как убедительно, что все, чтобы исправить свои конфигурации брандмауэра вряд ли хорошо выключены, вам лучше избегать этой проблемы с настройкой SSHD_CONFIG , настройку ClientaliveInterval . Чтобы сервер отправить почтовые сообщения клиенту, и закрыть соединение, если он не получает ответ.

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

0
05.03.2015, 17:58
3 ответа

, чтобы сравнить каждую строку до предыдущего, начиная с секунды:

awk '
    NR==1{
        split($0,U,"")
        next}
    {
        s=split($0,A,"")
        f=1
        if(length(U)>s)
            s=length(U)
        for(i=1;i<=s;i++)
            if(A[i]==U[i]&&f!=0)
                printf("%s",A[i])
            else {
                f=0
                U[i]=A[i]}
        print ""}
'
0
28.01.2020, 02:51

Чистый басовый раствор. Обратите внимание, что выход для 1 и 2 - FILE00000109, а не FILE0000010.

#!/bin/bash
arr=(FILE0000010985.LOG
     FILE0000010999.LOG
     FILE0000011000.LOG
    )
for (( i=0; i<${#arr[@]}; ++i )) ; do
    for (( j=i + 1; j<${#arr[@]}; ++j )) ; do
        x=${arr[i]}
        y=${arr[j]}
        p=0
        while [[ ${x:0:p} == ${y:0:p} ]] ; do 
            (( ++p ))
        done
        echo $x $y : ${x:0:p-1}
    done
done
1
28.01.2020, 02:51

Если два файла гарантированно различаются, то одна возможность -

f1=FILE0000010985.LOG
f2=FILE0000010999.LOG

for ((l=0; l<${#f1}; l++))
do [[ ${f1:0:l} != "${f2:0:l}" ]] && break
done
printf "%s\n" "${f1:0:l-1}"

(Если файлы могут быть равны, то необходимо добавить дополнительный тест)

.
0
28.01.2020, 02:51

Теги

Похожие вопросы