Передача Localhost:Port к ExternalIP:NewPort

Модель Expect взаимодействия не включает разделение stdout и stderr потоков. При порождении процесса Вы создаете новый pseudo-TTY, который ведет себя почти тождественно к тому, что пользователь видел бы в их терминале, и пользователь не может обычно различать два.Попробуйте:

$ echo "This is stdout"
This is stdout
$ echo "This is stderr" 1>&2
This is stderr

Не делая чего-то для маркировки различия Ожидайте, не может отличить их (точно так же, как пользователь на командной строке). Поэтому Ожидайте, может быть неправильный инструмент для того, что необходимо сделать.

Теперь, не зная точно, почему Вам нужно это, трудно придумать альтернативный метод для Вас. Поскольку, в чем Вы нуждаетесь, похоже, что можно выполнить это с единственной командой ssh:

ssh -q -o StrictHostKeyChecking=no $username@$hostname "ls -lrt; df -h" 1>>successlog 2>>errorlog

Для другого языка сценариев со встроенной поддержкой порождения дочернего процесса и получения его stdout и stderr отдельно, попробуйте Python и его модуль подпроцесса.

import shlex
from subprocess import Popen, PIPE
cmd = Popen(shlex.split('ssh -q -o StrictHostKeyChecking=no $username@$hostname "ls -lrt; df -h"'), stdout=PIPE, stderr=PIPE)
cmd.wait() # Wait for the command to complete
success_output = cmd.stdout
error_output = cmd.stderr

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

spawn ssh -q -o StrictHostKeyChecking=no $username@$hostname
# Receive password prompt and send the password here...
expect {
    -ex $prompt { send "ls -lrt\r" }
    timeout {
        send_user "Everything is terrible forever.\n"
        exit 1
    }
}
expect {
    -ex $prompt {
        set output $expect_out(buffer)
        send {echo RETVAL::$?::}
        send "\r"
    }
    timeout {
        send_user "Everything is terrible forever.\n"
        exit 1
    }
}
expect {
    -ex {RETVAL::0::} {
        set fp [open successlog a]
        puts $fp $output
        close $fp
    }
    -re {RETVAL::[1-9][0-9]*::} {
        set fp [open errorlog a]
        puts $fp $output
        close $fp
    }
    timeout {
        send_user "Everything is terrible forever.\n"
        exit 1
    }
}
8
02.02.2015, 15:51
2 ответа

Я решил сделать это сам.

2 для этого должны быть установлены правила и флаг.

Пример, используемый здесь, для "telnet localhost XXXX", должен пересылать пакеты на Ext.er.nal.IP:YYYYY.

sysctl -w net.ipv4.conf.all.route_localnet=1

Этот флаг, к сожалению, существует только на самых последних ядрах linux и недоступен на старом ядре (альтернативного флага в старом ядре тоже нет). Но я не уверен, какое именно ядро является доступным флагом. Думаю, что он доступен на ядрах версий 3.XX. Этот флаг предназначен для того, чтобы считать адреса обратного шлейфа правильным адресом источника или назначения. Источник: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt

iptables -t nat -A OUTPUT -p tcp --dport XXXX -j DNAT --to-destination Ext.er.nal. IP:YYYY

Вышеприведенная команда изменит пакеты, которые находятся на localhost:XXXX с IP-адресом назначения как Ext.er.nal.IP:YYYY

iptables -t nat -A POSTROUTING -j MASQUERADE

Команда изменит IP-адрес источника как публичный ip вашей машины.

Вы можете сделать свои правила немного более строгими, добавив соответствующие IP-адреса источника и назначения и интерфейсы, используя -s, -d, -i и -o. См. раздел "man iptables".

Спасибо Джону WH Смиту и Вуртелу. Предложения были очень полезны.

12
27.01.2020, 20:09

Моя проблема была моим TFTP. Теперь я использую FTP, и он работал.

Когда я был на TFTP, мой файл был преобразован в «DOS».

Так что теперь я использую FTP, и я преобразую свой файл в «Unix», когда я их беру. Спасибо за вашу помощь.

-121--205426-

Самый простой способ достижения этого является установка NetCat и INETD (Debian имеет это в OpenBSD-inetd ).

Добавьте строку в /etc/inetd.conf :

127.0.0.1:1234 stream tcp nowait root /bin/nc nc ex.ter.nal.ip 1234

Заменить 1234 1234 с номером реального порта и Ex.ter.nal.pip с реальным внешним IP-адресом. Вам может потребоваться добавить .1000 или некоторое большее число на опцию Nowait , если необходимо сделать более 128 соединений в минуту; Это для предотвращения бегающих соединений от загрузки вашей системы не подлежат.

У меня также есть -Q 4 -W 10 как NC вариантов, как это помогает в моей ситуации, но вам не понадобится.

Перезагрузка INETD После изменения файла inetd.conf .

Делать это таким образом, использует NC , созданный INETD в качестве процесса реле, который работает довольно хорошо.

6
27.01.2020, 20:09

Теги

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