sftp アプリを PyObjC で作るって話。
やってます、上手くいかないだけです。
とりあえず今やっていること。
sshpass/main.c at master ? bauruine/sshpass ? GitHub
sshpass のソースってたったコレだけなんだよね。
これなら Python3 の標準モジュールだけで模写できそうだと考えた。
UNIX の中身の勉強にもなるし一石二鳥。
/dev/ptmx って何だ?
Ubuntu Manpage: ptmx, pts – 擬似端末のマスタとスレーブ
たしかに sudo や ssh は stdin やパイプからの入力はできない。
/dev/ptmx を利用すればなんとかなるってことね。
#!/usr/bin/env python3 import os, signal, fcntl # Ctrl+C signal.signal(signal.SIGINT, signal.SIG_DFL) # ptmx masterpt = os.open('/dev/ptmx', os.O_RDWR) # not macOS #fcntl.fcntl(masterpt, fcntl.F_SETFL, os.O_NONBLOCK) #name = os.ttyname(masterpt) childpid = os.fork() if childpid == 0: os.setsid() #os.execvp('ssh', ['ssh', 'sasakima-nao@mba2.local']) os.execvp('python3', ['python3']) # Error print(f'{__file__}: Failed to run command') #slavept = os.open(name, os.O_RDWR|os.O_NOCTTY) os.close(masterpt) #os.close(slavept) print(f'{__file__}: EOL')
とりあえず fork して execvp することはできた。
呼び出し側のプロセスを終了して子プロセスに置き換える。
ほぼ os モジュールだけでなんとかなるのようで。
起動すると EOL が表示され Python3 インタプリタが始まる。
Ctrl+D すると bash はもう破棄されているので gnome-terminal が終了する。
macOS では「プロセスが完了しました」と出る。
で、ssh のほうの現状。
こんなになってしまう。
sshpass.c をトレースしているつもりだけどまだ何か間違っているっぽい。
上手くいったらまた今度。