Здесь пригодится «типирование утки» - оно не обязательно должно быть УТКОЙ (= файл), оно просто ДОЛЖНО БЫТЬ, как один.
Небольшой эксперимент показывает, что с любым объектом, который имеет допустимый метод readlines (), все в порядке.
Я подделал это:
def myfakefile(keystring):
myfakefile.readlines=lambda: keystring.split("\n")
return myfakefile
mykey = paramiko.RSAKey.from_private_key(myfakefile(keystring))
Это невероятно нахально, но работает.
Что это делает, когда вы вызываете myfakefile (keystring), он создает myfakefile.readlines, который возвращает (разделенное) содержимое цепочек ключей.
Затем он возвращает функцию.
Эта же функция передается from_private_key. from_private_key, думая, что это файл, вызывает myfakefile.readlines (). Это вызывает вновь созданную (лямбда) функцию, которая возвращает то, что вы ожидаете от file.readlines () - или, в любом случае, достаточно близко.
Обратите внимание, что сохранение результатов не будет работать должным образом:
k1=myfakefile(keystring1)
k2=myfakefile(keystring2)
# This will return keystring2, not keystring1!
paramkiko.RSAKey.from_private_keyfile(k1.readlines())
Существуют более надежные способы заставить это работать должным образом, но не стоит усилий - просто используйте StringIO, если ваши потребности более сложные.