2012/04/23

PowerShell - путь к успеху

PowerShell - некое расширение cmd.exe, плотно взаимодействующее с .NET, позволяющее выполнять различные команды и тем самым автоматизировать работу в системе. Есть возможность удаленного подключения во второй версии, прямо как SSH!
Правда сам язык команд крайне сложен в понимании, а справка организована весьма плачевно. Тем не менее, это уже хоть что-то.

В современных виндоусах он присутствует по умолчанию, в старых версиях же придется немного попотеть, доустановив нужные компоненты:
1. NET. Framework 2.0 SP1
2. Windows Management Framework Core

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

Для того, чтобы иметь возможность подключаться к компьютеру удаленно через PowerShell, нужно для начала активировать эту возможность:
Enable-PSRemoting
Кроме того, нужно быть в списке доверенных хостов, по умолчанию там никого нет. Не будем долго запариваться и разрешим всем хостам соединяться:
Set-Item WSMan:\localhost\Client\TrustedHosts *
Ну и последним сюрпризом стало то, что просто так скрипты не запустишь, их выполнение либо совсем отключено, либо они должны быть подписаны! Для устранения этого недостатка просто изменим политику:
Set-ExecutionPolicy Unrestricted
После всех этих манипуляций наконец-то придем к успеху - удаленному запуску скриптов на машине с PowerShell:
Invoke-Command -ComputerName "mycomfyserver" -credential Administrator -FilePath D:\myscript.ps1

2012/04/17

Шифрование AES с помощью pycrypto

Pycrypto - весьма удобный модуль, в котором реализованы различные схемы шифрования. Вот простой пример, как можно шифровать и расшифровывать данные с помощью симметричного AES:
from Crypto.Cipher import AES
import base64
import os

# размер блока шифрования
BLOCK_SIZE = 32

# символ, использующийся для дополнения шифруемых данных
# до размера, кратного 32 байтам
PADDING = '{'

# функция дополнения
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING

# функции шифрования и расшифрования
# результат дополнительно обертывается в base64
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)

# генерируем ключ
secret = os.urandom(BLOCK_SIZE)

# создаем объект
cipher = AES.new(secret)

# шифруем строку
encoded = EncodeAES(cipher, 'password')
print 'Encrypted string:', encoded

# расшифровываем строку
decoded = DecodeAES(cipher, encoded)
print 'Decrypted string:', decoded
Как видно, все достаточно просто, а главное полезно. Таким образом можно шифровать трафик, конфиги с критичной инфой или что-то ещё. При этом конечно необходимо как-то защитить сам ключ, например, скомпилировав скрипт в бинарник и навесив на него всяческих коварных крипторов.

2012/04/10

Python и перенос строк в файлах

Многим известно, что в разных системах перенос строки в файлах обозначается разным образом. Например, в Windows это CR+LF (0x0d + 0x0a), а в *NIX это просто LF.
Самое интересное, когда нам нужно в винде сформировать файл с переносами строк под линукс или наоборот.
Представим, что мы открыли файл в режиме w, что я делаю обычно на автомате.
Если мы будем писать типа file.write('qwerty\n'), то в файл запишется CR+LF. Аналогично произойдет, если заменить \n на \x0a. А если писать просто file.write('qwerty'), то никакого переноса не будет. Оказывается открывая файл в режиме w при записи строки к ней автоматически добавляется перенос строки в системном формате.

В этом случае нам поможет открытие файла в бинарном режиме, то есть wb. Тогда никакого безобразия с добавлением виндовых переносов строк не происходит и мы можем со спокойной совестью писать file.write('qwerty\n').