Используя C ++, я создал FILE *, используя libexpect:
FILE* fd = exp_popen("ssh root@sunblaze");
Я попал в командную строку, используя:
exp_fexpectl(fp , exp_exact , "password: " , 1 , exp_end);
Теперь остальные находятся в оболочке bash, и я хочу получить содержимое файла там,
поэтому я должен запустить команду cat /port1/port
и получить все, что он печатает в буфере символов.
Как я могу это сделать?
fgets
не похоже на работу …
заранее спасибо
Предполагая, что ваша машина и «sunblaze» находятся в защищенной, защищенной от огня среде, я бы использовал «ssh-keygen» и «ssh-copy-id root @ sunblaze», чтобы ваш идентификатор пользователя мог войти в систему, чтобы загорать без пароля. , Таким образом, в вашем коде нет пароля, на который кто-то может взглянуть.
Да, я знаю, это было не то, что вы спрашивали …
Я не понимаю, почему fgets(str, size, fd);
— У меня будет небольшая игра, чтобы выяснить …
Это определенно работает:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tcl8.5/expect.h>
#include <errno.h>
int main()
{
char str[512];
FILE *f = exp_popen("ssh user@mybox ls -lR");
if (f==NULL)
{
printf("Failed (%s)\n", strerror(errno));
return 1;
}
while(fgets(str, sizeof(str)-1, f))
{
printf("%s", str);
}
return 0;
}
Однако, если вывод ssh не имеет новой строки, очевидно, fgets () не завершится. Когда я впервые попробовал, он застрял на вопросе о пароле — но когда я изменил его на машину, на которую я могу войти без пароля, он работал нормально.
нашел способ, после создания соединения, как я сделал, оболочка:
[root@sanblaze ~]#
я пишу команду, используя, например:
fputs("echo LinkReset > /port4/port\r" , fp);
exp_fexpectl(fp, exp_exact , "]# " , 1 , exp_end);
чтение содержимого файлов с помощью grep:
fputs("cat /port4/port | grep -w Mode\r" , fp);
exp_fexpectl(fp, exp_exact , "]# " , 1 , exp_end);
после выполнения вышеизложенного, выражение «exp_buffer», являющееся глобальной переменной, содержит весь текст, полученный из удаленной оболочки с момента последнего запуска «exp_fexpectl», ведьма означает только вывод моей команды. осталось только разобрать его.