Модель 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
}
}
Я решил сделать это сам.
2 для этого должны быть установлены правила и флаг.
Пример, используемый здесь, для "telnet localhost XXXX", должен пересылать пакеты на Ext.er.nal.IP:YYYYY.
Этот флаг, к сожалению, существует только на самых последних ядрах linux и недоступен на старом ядре (альтернативного флага в старом ядре тоже нет). Но я не уверен, какое именно ядро является доступным флагом. Думаю, что он доступен на ядрах версий 3.XX. Этот флаг предназначен для того, чтобы считать адреса обратного шлейфа правильным адресом источника или назначения. Источник: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
Вышеприведенная команда изменит пакеты, которые находятся на localhost:XXXX с IP-адресом назначения как Ext.er.nal.IP:YYYY
Команда изменит IP-адрес источника как публичный ip вашей машины.
Вы можете сделать свои правила немного более строгими, добавив соответствующие IP-адреса источника и назначения и интерфейсы, используя -s, -d, -i и -o. См. раздел "man iptables".
Спасибо Джону WH Смиту и Вуртелу. Предложения были очень полезны.
Моя проблема была моим 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
в качестве процесса реле, который работает довольно хорошо.