Архив рубрики: Полезное по Windows

Красноярский сайт о Windows. Все, что связанно с Windows, мои личные записки и опыт. А так как я проживаю в Красноярске, очень многие Windows статьи имеют прямое отношение к этому городу.

Стандартные потоки вывода (stdout) Windows или как перенаправить вывод консоли (cmd) в файл

С помощью переназначения устройств ввода/вывода одна программа может направить свой вывод на вход другой или перехватить вывод другой программы, используя его в качестве своих входных данных. Таким образом, имеется возможность передавать информацию от процесса к процессу при минимальных программных издержках.

Практически это означает, что для программ, которые используют стандартные входные и выходные устройства, операционная система позволяет:

Есть 3 файловых дескриптора: stdin — стандартный ввод, stdout — стандартный вывод и stderr — стандартный поток ошибок.  В скриптах 1 означает stdout, а 2stderr.

  • перенаправлять stdout в файл
  • перенаправлять stderr в файл
  • перенаправлять stdout в stderr
  • перенаправлять stderr в stdout
  • перенаправлять stderr и stdout в файл
  • перенаправлять stderr и stdout в stdout
  • перенаправлять stderr и stdout в stderr
  • перенаправление stderr и stdout по конвейеру

Все вышесказанное является привычной обыденностью для любого пользователя любой nix системы, но в среде Windows, данные возможности применяются крайне редко, хотя на самом деле они там есть и всё практически идентично.

 

А теперь примеры:

1. Перенаправление стандартного потока программы в файл с заменой содержимого файла

ping ya.ru -t > log.txt или так ping ya.ru -t 1> log.txt

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

2. Перенаправление стандартного потока программы в файл с до записью содержимого лога

ping ya.ru -t >> log.txt или так ping ya.ru -t 1>> log.txt

тоже самое, но при прерывание пинга и начале нового, старое содержимое лога не затрется, а новое дописывается в конец.

3. Перенаправление потока ошибок программы в фаил с заменой содержимого

ping ya.ru -t 2> log.txt

при этом, стандартный поток программы пойдет на экран, а ошибки будут записаны в лог, с заменой содержимого.

4. То же самое, но с до записью содержимого лога.

ping ya.ru -t 2>> log.txt

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

ping ya.ru >log.txt 2>&1  или с до записью лога ping ya.ru >>log.txt 2>&1

В данном примере стандартный поток ошибок пересылается в стандартный поток (конструкция 2>&1) а потом стандартный поток (уже с завернутым в него потоком ошибок) посылается в лог.

6. В этом примере все наоборот, стандартный поток, пересылается в поток ошибок и уже поток ошибок перенаправляется в лог:

ping ya.ru >log.txt 1>&2  или с до записью лога ping ya.ru >>log.txt 1>&2

7. По аналогии с Linux системами в Windows можно перенаправить весь или часть вывода программы в виртуальное устройство, а проще говоря слить в мусор.

Таким устройством является nul, и делать перенаправление в него можно используя все выше представленные комбинации.

Например: ping ya.ru >nul

P.S. В Linux есть еще одна конструкция перенаправления, а именно &>/var/log/log.txt, она перенаправляет ВЕСЕ без исключения потоки программы в указанное место, по сути являясь более коротким и более грамотным аналогом конструкции >log.txt 1>&2. Но к сожалению в Windows это не работает.

А теперь давайте немного разберемся в прикладных различиях между работой данных методов. В нормальных приложениях все разбито на потоки, но у большинства виндовых утилит это не так, пинг например, пишет все в стандартный поток (на экран), поэтому для него конструкция вида 2> не имеет смысла. Но есть еще не виндовые утилиты, для примера возьмем curl (мой любимый).

Он разделяет 3 вида вывода, вывод полезной информации, вывод служебной информации и вывод ошибок. Если перенаправить вывод так: > или >> или 1> или 1>> то по завершению запроса отобразится служебная информация о запросе, а вся полезная информация уйдет в лог (это именно то, что уходит по конвейеру | ).

curl

 

 

 

 

 

 

 

 

 

А теперь сделаем заведомо ошибочный запрос, изменив протокол http на http3 не меняя вывода в лог. В итоге мы получим ошибку на экране.

curl

 

 

 

 

 

 

 

 

 

Изменим вывод в лог на один из этих: 2> или 2>> ошибка ранее выводившаяся на экран, попала в лог, и на экране ничего не будет (служебной информации нет, так как запрос произведен не был).

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

И вывод был бы таким:

curl

 

 

 

 

 

 

 

 

 

То есть, полная тишина, вся информация, как то полезный вывод, ошибки программы, служебная информация, все ушло в лог.

На данном скриншоте, конструкцией 2>&1 мы завернули поток ошибок, в стандартный поток, а конструкцией >5555.txt стандартный поток перенаправили в лог. Если вместо >5555.txt использовать 2>5555.txt, то есть перенаправить в лог стандартный поток ошибок, мы увидим весь вывод программы (и ошибки, и служебную информацию и полезный вывод) на экране. Конструкция 2>&1 имеет больший приоритет, а по ней уже все завернуто в стандартный поток.

Делать пример с заворотом стандартного потока в поток ошибок (1>&2) я не буду, ибо там все точно так же.

Надеюсь логика понятна…

Так же с помощью символа < можно прочитать входные данные для заданной команды не с клавиатуры, а из определенного (заранее подготовленного) файла. Для примера возьмем реальный и вполне полезный случай. Например, у нас есть файл log.txt и нам надо посчитать сколько в нем строк. Сделать это можно с помощью такой конструкция find /c /v "" log.txt но вывод будет не совсем приемлемым.

Подсчет колличества строк в файле в CMD

 

 

 

 

 

 

 

 

 

А вот если сделать так: find /c /v «» <log.txt то все будет именно так как надо.

Подсчет колличества строк в файле в CMD

 

 

 

 

 

 

 

 

 

Это происходит потому что в первом случае, файл обрабатывается как файл, а во втором, как поток (аналог линуксового конвейера cat log.txt | ) в общем, < это виндовый аналог cat со всеми вытекающими.

На этом все. Если есть замечания или дополнения, прошу в комменты.

Список номеров ip протоколов

Пригодится для построения сложных правил или для работы со сложными сервисами (как например GRE тоннель завернутый в IPSec).

Номер Ключевое Протокол
слово
======= ======= ==============
0 HOPOPT IPv6 Hop-by-Hop Option
1 ICMP Internet Control Message
2 IGMP Internet Group Management
3 GGP Gateway-to-Gateway
4 IP IP in IP (инкапсуляция)
5 ST Stream
6 TCP Transmission Control
7 CBT CBT
8 EGP Exterior Gateway Protocol
9 IGP любой частный внутренний шлюз
(используется компанией Cisco для протокола IGRP)
10 BBN-RCC-MON BBN RCC Monitoring
11 NVP-II Network Voice Protocol
12 PUP PUP
13 ARGUS ARGUS
14 EMCON EMCON
15 XNET Cross Net Debugger
16 CHAOS Chaos
17 UDP User Datagram
18 MUX Multiplexing
19 DCN-MEAS DCN Measurement Subsystems
20 HMP Host Monitoring
21 PRM Packet Radio Measurement
22 XNS-IDP XEROX NS IDP
23 TRUNK-1 Trunk-1
24 TRUNK-2 Trunk-2
25 LEAF-1 Leaf-1
26 LEAF-2 Leaf-2
27 RDP Reliable Data Protocol
28 IRTP Internet Reliable Transaction
29 ISO-TP4 ISO Transport Protocol Class 4
30 NETBLT Bulk Data Transfer Protocol
31 MFE-NSP MFE Network Services Protocol
32 MERIT-INP MERIT Internodal Protocol
33 SEP Sequential Exchange Protocol
34 3PC Third Party Connect Protocol
35 IDPR Inter-Domain Policy Routing Protocol
36 XTP XTP
37 DDP Datagram Delivery Protocol
38 IDPR-CMTP IDPR Control Message Transport Proto
39 TP++ TP++ Transport Protocol
40 IL IL Transport Protocol
41 IPv6 Ipv6
42 SDRP Source Demand Routing Protocol
43 IPv6-Route Routing Header for IPv6
44 IPv6-Frag Fragment Header for IPv6
45 IDRP Inter-Domain Routing Protocol
46 RSVP Reservation Protocol
47 GRE General Routing Encapsulation
48 MHRP Mobile Host Routing Protocol
49 BNA BNA
50 ESP Encap Security Payload for IPv6
51 AH Authentication Header for IPv6
52 I-NLSP Integrated Net Layer Security TUBA
53 SWIPE IP with Encryption
54 NARP NBMA Address Resolution Protocol
55 MOBILE IP Mobility
56 TLSP Transport Layer Security Protocol
с использованием обработки ключей Kryptonet
57 SKIP SKIP
58 IPv6-ICMP ICMP for IPv6
59 IPv6-NoNxt No Next Header for IPv6
60 IPv6-Opts Destination Options for IPv6
61 любой внутренний протокол узла
62 CFTP CFTP
63 любая локальная сеть
64 SAT-EXPAK SATNET и Backroom EXPAK
65 KRYPTOLAN Kryptolan
66 RVD MIT Remote Virtual Disk Protocol
67 IPPC Internet Pluribus Packet Core
68 любая распределенная файловая система
69 SAT-MON SATNET Monitoring
70 VISA VISA Protocol
71 IPCV Internet Packet Core Utility
72 CPNX Computer Protocol Network Executive
73 CPHB Computer Protocol Heart Beat
74 WSN Wang Span Network
75 PVP Packet Video Protocol
76 BR-SAT-MON Backroom SATNET Monitoring
77 SUN-ND SUN ND PROTOCOL-Temporary
78 WB-MON WIDEBAND Monitoring
79 WB-EXPAK WIDEBAND EXPAK
80 ISO-IP ISO Internet Protocol
81 VMTP VMTP
82 SECURE-VMTP SECURE-VMTP
83 VINES VINES
84 TTP TTP
85 NSFNET-IGP NSFNET-IGP
86 DGP Dissimilar Gateway Protocol
87 TCF TCF
88 EIGRP EIGRP
89 OSPFIGP OSPFIGP
90 Sprite-RPC Sprite RPC Protocol
91 LARP Locus Address Resolution Protocol
92 MTP Multicast Transport Protocol
93 AX.25 AX.25 Frames
94 IPIP IP-within-IP Encapsulation Protocol
95 MICP Mobile Internetworking Control Pro.
96 SCC-SP Semaphore Communications Sec. Pro.
97 ETHERIP Ethernet-within-IP Encapsulation
98 ENCAP Encapsulation Header
99 любая частная схема шифрования
100 GMTP GMTP
101 IFMP Ipsilon Flow Management Protocol
102 PNNI PNNI over IP
103 PIM Protocol Independent Multicast
104 ARIS ARIS
105 SCPS SCPS
106 QNX QNX
107 A/N Active Networks
108 IPComp IP Payload Compression Protocol
109 SNP Sitara Networks Protocol
110 Compaq-Peer Compaq Peer Protocol
111 IPX-in-IP IPX in IP
112 VRRP Virtual Router Redundancy Protocol
113 PGM PGM Reliable Transport Protocol
114 любой протокол 0-hop
115 L2TP Layer Two Tunneling Protocol
116 DDX D-II Data Exchange (DDX)
117 IATP Interactive Agent Transfer Protocol
118 STP Schedule Transfer Protocol
119 SRP SpectraLink Radio Protocol
120 UTI UTI
121 SMP Simple Message Protocol
122 SM SM
123 PTP Performance Transparency Protocol
124 ISIS over IPv4
125 FIRE
126 CRTP Combat Radio Transport Protocol
127 CRUDP Combat Radio User Datagram
128 SSCOPMCE
129 IPLT
130 SPS Secure Packet Shield
131 PIPE Private IP Encapsulation within IP
132 SCTP Stream Control Transmission Protocol
133 FC Fibre Channel
134-254 свободные номера
255 зарезервированный номер

Убираем «локальные папки» в Thunderbird

С незапамятных времен я пользуюсь почтовым клиентом Thunderbird и все в нем замечательно, кроме одного момента который мозолил мне глаз. Это так называемые «локальные папки«. Если пользуясь POP3 их можно использовать как место доставки почты, тем самым абстрагировавшись от учетных записей, то с IMAP это не проходит. При использование IMAP входящие и отправленные нельзя перенести в «локальные папки«, вот и получается что помимо ящика IMAP висят еще и эти «локальные папки«.

Как то коряво конечно объяснил, но более понятно сформулировать не могу. Поэтому покажу на скриншотах.

Я собираю в один IMAP ящик всю свою почту с более чем 10 аккаунтов, выглядит оно так:

Thunderbird

Я как раз выделил эту раздражающую меня дисгармонию.

Что бы убрать эти папки, надо открыть директорию с профилем (думаю все это смогут).

Выключить Thunderbird ЭТО ОБЯЗАТЕЛЬНО И ОЧЕНЬ ВАЖНО!

Найти и открыть любым текстовым редактором файл prefs.js. ТОЛЬКО ПРЕДВАРИТЕЛЬНО СДЕЛАЙТЕ КОПИЮ, ИБО ИЗМЕНЕНИЯ В ЭТОМ ФАЙЛЕ МОГУТ ПРИВЕСТИ К НЕПРЕДСКАЗУЕМЫМ ПОСЛЕДСТВИЯМ! У меня в ходе экспериментов один раз слетели все учетные записи, во второй раз все SMTP сервера потерлись, а один раз Thunderbird вообще перестал стартовать, хотя делал я одно и тоже.

В общем вот, открыли файл и стираем все строчки в которых упоминается Local Folders.

 

Файл этот обновляется при открытие и закрытие Thunderbird, поэтому пытаться закомментировать содержимое бесполезно. Только удалять и только на выключенном Thunderbird.

 

ThunderbirdПосле этих манипуляций «локальные папки» Thunderbird исчезают. Они исчезают не только внешне, в настройках их тоже не будет.

Кому-то это не надо, но мне это принесло душевное равновесие.

Я прямо почувствовал как у меня чакры подтянулись и на карме заросли несколько дырок.

 

 

Перемещаемый профиль, увеличиваем стандартный размер профиля

Перемещаемый профиль Windows

Максимально допустимый размер перемещаемого профиля в Windows server 2003\2008 составляет 30 мегабайт. Но что делать, если край ямы надо этот профиль сделать больше (есть некоторые бухгалтерские утилитки, которые размещают свои файлы в профиле пользователя, и никак их оттуда не выгрести и не обмануть симлинками и прочем).

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

Открываем в «Блокноте» файл System.adm на всех контроллерах домена Windows находящийся в папке %SystemRoot%\Winnt\Inf

Находим следующий раздел:

PART !!ProfileSize NUMERIC REQUIRED SPIN 100
VALUENAME «MaxProfileSize»
DEFAULT 30000
MAX 30000
MIN 300
END PART

Увеличиваем максимальное значение размера перемещаемого профиля (MAX) до нужного. Сохраняем файл System.adm, повторяем операцию для других контроллеров домена.

После всех этих манипуляций максимальное значение размера перемещаемого профиля в настройках групповой политики будет равно выставленному вами.

Размер перемещаемого профиля 50 мегабайт

 

 

 

 

 

 

 

 

 

 

 

У меня это 50 мегабайт, как раз та малость, которой и не хватало.

Почти бесшовый RDP в Linux

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

Они предназначены для более удобной интеграции приложений в среду X Window, а если проще, что бы пользователи под Linux видели как моргает аська, работая в 1с под терминалом.

Банально? Ну да, банально, но пользователи часто плачут от этого ))) причем этой от этой же проблемы с терминалом страдают и пользователи Windows. Ну что же, будем помогать линуксойдам, а виндузятники пусть ждут перевода серверов на Windows server 2008 и RemoteApps.

Самая частая схема такова:

1. SeamlessRDP — http://www.cendio.com/seamlessrdp/
2. RDP не ниже 4 версии
3. rdesktop 1.5.0 и выше — http://www.rdesktop.org/

Скачиваем на терминальный сервер SeamlessRDP от сюда — http://xaxatyxa.ru/download/seamlessrdp.zip или с официального сайта, кладем ее в папку, например, C:\Program Files\seamlessrdp\ и запускаем rdesktop со следующими параметрами:

rdesktop -A -s "c:\seamlessrdp\seamlessrdpshell.exe notepad"

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

Можно сделать финт ушами, и пойти немного другим путем, создать псевдо бесшовное приложение. А если быть точным, то просто установить RDP соединение с определенными размерами окна и в таком положение, что бы оно не закрывала статус бар, причем делать это будем без доп компонентов.

Суть метода такова:

1. Стандартной утилитой xrandr узнаем разрешение экрана пользователя.
2. Разпарсиваем полученные значение на вертикальное и горизонтальное разрешение.
3. Подключаемся к через rdesktop откусив снизу экрана значение размером со статусбар.

В этом месте надо подобрать размер вашего статус бара и поправить цифру -g$(($X))x$(($Y-26))

P.S. Если кто то может подсказать где можно спарсить размеры панели задач, то я был бы очень благодарен за эту инфу и адаптировал бы скрипт на полную автоматику.

# Получаем текущее разрешение экрана в виде xres*yres
XY=`xrandr | grep -E -o 'current [0-9]{1,4} x [0-9]{1,4}' | tr -d current[:blank:]`

# Выделяем xres и yres
X=`echo $XY | grep -E -o '[0-9]{1,4}x' | tr -d x`
Y=`echo $XY | grep -E -o 'x[0-9]{1,4}' | tr -d x`

# Собственно строка подключения.
# Главная тут секция с разрешением экрана -g$(($X))x$(($Y-26))

rdesktop -N -z -P -xm -a 16 -g$(($X))x$(($Y-26)) -T "Заголовок окна" -D -S standard -s '"C:\Program Files\1Cv77.ADM\BIN\1cv7.exe" enterprise /D"F:\Bases\Db"' -r 'disk:Z=/home/user' -r 'printer:PRN1=HP LaserJet 6L' -u user -p "password" 192.168.0.100

Что бы не партьися по поводу поиска всех параметров, прилагаю мини справочник:

Применение: rdesktop [опция] сервер[:порт]
-u: имя пользователя
-d: домен
-s: Shell
-c: рабочий каталог
-p: пароль (- запрос)
-n: клиент хоста
-k: клавиатуры на сервер (EN-US, DE, SV и т.д.)
-g: разрешения экпана (WxH)
-f: полноэкранный режим
-b: битность обновления растрового изображения
-L: местные кодировки
-A: Включите режим SeamlessRDP
-B: использование BackingStore от X-сервера (если есть)
-e: отключить шифрование (французский TS)
-E: Отключение шифрования от клиента к серверу
-m: не передавать движение события
-C: использование собственной цветовой схемы
-D: спрятать окно менеджера украшения
-K: держать окно менеджера ключевых переплет
-S: Надпись кнопки размера (ни одной заявки в режиме)
-T: заголовок окна
-N: позволить numlock синхронизации
-X: вставлять в другое окно с заданным идентификатором.
-a: подключение глубина цвета
-z: включить сжатие RDP
-x: RDP5 experience (m[odem 28.8], b[roadband], l[an] or hex nr.)
-P: использование стойких растровый кэшировании
-r: включить указанное устройство редирект (этот флаг может быть повторен)
-0: Приложите к консоли
-4: Использование RDP версии 4
-5: Использование RDP версии 5 (по умолчанию)
-y: использование raw клавиатуры (по умолчанию нет)

Мы получили аналог бесшовного приложения, решив главную задачу, а именно, добились видимости статус бара. Причем это все без помощи дополнительных средств и усложнения «конструкции», к тому же схема работает под любой системой, в том числе и BSD.