Groovy a pseudo-terminál

Groovy a pseudo-terminál
« kdy: 14. 01. 2022, 16:10:31 »
Poradil by mi někdo, jak v Groovy spustit příkaz v pseudo-terminálu nebo mu nějak podstrčit šířku terminálu? Konkrétně mi jde o to, že se chci připojit v Groovy scriptu přes SSH na Mikrotik a získat seznam hostů v síti. Potíž je v tom, že výstup z Mikrotiku je zkrácený, takže namísto výstupu jako např.

Kód: [Vybrat]
Flags: D - dhcp
  ADDRESS         MAC-ADDRESS        TIME DNS                                        SNMP                                       NETBIOS                                     
  192.168.1.10    00:21:B7:83:BB:6C   2ms                                            ET0021B783BB6C                                                                         
  192.168.1.30    00:25:36:B1:C0:10   4ms                                            OKI-C834-B1C010

dostanu jen:
Kód: [Vybrat]
Flags: D - dhcp
  ADDRESS         MAC-ADDRESS        TIME DNS        SNMP        NETBIOS       
  192.168.1.10    00:21:B7:83:BB:6C   5ms            ET0021B7...               
  192.168.1.30    00:25:36:B1:C0:10   4ms            OKI-C834...               

V konzoli se tenhle problém dá řešit tak, že se ssh zavolá s parametrem -t, který naalokuje pty. To tady ale nefunguje. Věděl by někdo, jak to obejít? Klíčový kód vypadá nějak takto:
Kód: [Vybrat]
String shellcmd = "ssh -o StrictHostKeyChecking=no admin@172.16.122.56 /tool ip-scan duration=3 address-range=192.168.1.0/24"
String[] cmd = ["sh", "-c", shellcmd];
stdout = new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec(cmd).getInputStream()));
while ((s = stdout.readLine()) != null) {
  println(s)
}


Re:Groovy a pseudo-terminál
« Odpověď #1 kdy: 14. 01. 2022, 19:29:00 »
Nepomůže nastavit před spuštěním toho příkazu na vzdálené straně proměnné $LINES a $COLUMNS?

Re:Groovy a pseudo-terminál
« Odpověď #2 kdy: 14. 01. 2022, 19:58:10 »
Nepomůže nastavit před spuštěním toho příkazu na vzdálené straně proměnné $LINES a $COLUMNS?

Dobrá myšlenka. Dohledal jsem, jak se to řeší v RouterOS, viz https://wiki.mikrotik.com/wiki/Manual:Console_login_process#Console_login_options, ale bohužel to v tomto případě také nefunguje.

Re:Groovy a pseudo-terminál
« Odpověď #3 kdy: 14. 01. 2022, 22:26:02 »
Zeptal bych se přímo Mikrotiku.

Re:Groovy a pseudo-terminál
« Odpověď #4 kdy: 15. 01. 2022, 08:39:15 »
Neslo by ten vystup poslat do souboru a ten pak stahnout?


Re:Groovy a pseudo-terminál
« Odpověď #5 kdy: 15. 01. 2022, 08:40:35 »
zkusil bych api, na novym mktiku by melo byt snad i rest. na stary jsou knihovny i specifikace..

Re:Groovy a pseudo-terminál
« Odpověď #6 kdy: 15. 01. 2022, 09:36:12 »
Neslo by ten vystup poslat do souboru a ten pak stahnout?
To by ovšem byl výsledek úplně stejný. Problém je v tom, že ten skript evidentně zjišťuje, zda je výstup přesměrován do terminálu, a pokud ano, přizpůsobí se šířce terminálu. Pokud ne, nebo není schopen detekovat šířku terminálu, zvolí nějakou standardní šířku.

Nemá ten skript Mikrotiku nějaký parametr, kterým by se dal určit formát výstupu? Slušné programy to tak dělají, že bez parametrů zkouší uhodnout vhodné výchozí nastavení, ale pomocí parametrů to můžete ručně doladit.

Re:Groovy a pseudo-terminál
« Odpověď #7 kdy: 15. 01. 2022, 09:59:24 »
Neslo by ten vystup poslat do souboru a ten pak stahnout?
To by ovšem byl výsledek úplně stejný. Problém je v tom, že ten skript evidentně zjišťuje, zda je výstup přesměrován do terminálu, a pokud ano, přizpůsobí se šířce terminálu. Pokud ne, nebo není schopen detekovat šířku terminálu, zvolí nějakou standardní šířku.

Nemá ten skript Mikrotiku nějaký parametr, kterým by se dal určit formát výstupu? Slušné programy to tak dělají, že bez parametrů zkouší uhodnout vhodné výchozí nastavení, ale pomocí parametrů to můžete ručně doladit.

Je to tak. Bohužel zrovna IP scan je v Mikrotiku brán jako interaktivní utilita, která vůbec nepočítá s nějakým používáním ve skriptech. Nedá se pro něj taky prakticky nic nastavit. Obávám se, že v API ten IP scan ze stejného důvodu vůbec nebude, ale zkusím to. Zkoušel jsem všechno možné včetně přesměrování do souboru. Dá se tam nastavit šířka terminálu, ale to nemá vůbec vliv když s tím pracuji výše popsaným způsobem. Asi skončím u toho, že budu muset použít nějakou knihovnu, která mi umožní navázat normální session.

Re:Groovy a pseudo-terminál
« Odpověď #8 kdy: 15. 01. 2022, 18:08:11 »
Přišel jsem na to! Je třeba SSH zavolat se zdvojeným parametrem -t, do loginu přidat šířku terminálu a zároveň je ještě třeba přidat příkaz pro ukončení sezení, což je v případě RouterOS příkaz quit. Tzn. že samotný příkaz má vypadat nějak takto:
Kód: [Vybrat]
ssh -t -t -o StrictHostKeyChecking=no -p22022 admin+ct120w@172.16.122.87 '/tool ip-scan duration=5  address-range=192.168.1.0/24;quit'

Re:Groovy a pseudo-terminál
« Odpověď #9 kdy: 16. 01. 2022, 17:05:20 »
Gratuluji  ;D