Envío de códigos de control ASCII con asyncssh

Estoy escribiendo un pequeño script de prueba que ejercita las instalaciones asíncronas. Uno de los escenarios de prueba es el ping localhostproceso en ejecución y luego el envío CTRL+\al resumen intermedio del informe. Sin embargo, no he tenido éxito al enviar códigos de control ASCII. Aquí hay un código de prueba:

async def test_control_code():
  async with asyncssh.connect(host='localhost', username='user', password='userpw', known_hosts=None) as conn: 
    async with conn.create_process('ping localhost') as proc: 
      proc._stdin.write(b'\x1c') # Error, says can't send in bytes

if __name__ == '__main__': 
  asyncio.run(test_control_code())

¿Cómo puedo enviar CTRL + \al proceso en ejecución usando asyncssh?

Answer

Bien, aquí está el problema. El pingcomando no busca la secuencia Ctrl-\. De hecho, pingno lee desde stdin en absoluto, por lo que nada de lo que envíe lo afectará de ninguna manera.

Cuando escribe Ctrl-\ en una sesión de terminal de Linux, el emulador de terminal genera una señal SIGQUIT para el proceso en primer plano. Eso es lo pingque busca. Como no tiene una sesión de terminal, no hay nadie para hacer esa traducción.

Entonces, en lugar de forzar caracteres, simplemente envíe la señal directamente:

    proc.send_signal(signal.SIGQUIT)