-
Notifications
You must be signed in to change notification settings - Fork 333
Add an environement variable to control stdio mode #759
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Conversation
stdio descriptors (stdin, stdout and stderr) can be operated in various modes by win32compat code. The behavior is set very early in fd_table_initialize() by setting pio->type. In PowerShell/Win32-OpenSSH#1427 it was chosen to set pio->type to NONSOCK_SYNC_FD to resolve an I/O hang problem. Unfortunately this introduce problems for other ssh usage. sshfs-wiun uses ssh and has at leas 6 open issues for the same problem introduced by this NONSOCK_SYNC_FD change: https://github.com/winfsp/sshfs-win/issues?q=is%3Aissue+cb+%3A87 The sshfs-win workaround it to use an older ssh.exe from cygwin, which is bundled with sshfs-win. This program is unable to use ssh-agent, which is quite frustrating. And if PATH is not set to use it, sshfs-win cannot work. This change introduce an OPENSSH_STDIO_MODE environment variable that can be set to the following values: unknown, sock, nonsock, nonsock_sync. It cause pio->type to be set to UNKNOWN_FD, SOCK_FD, NONSOCK_FD, and NONSOCK_SYNC_FD respecitively. The default behavior when the variable is not set is unchanged (which means NONSOCK_SYNC_FD). Setting OPENSSH_STDIO_MODE="nonsock" lets sshfs-win work again with openssh-portable ssh.exe. ssh-agent can be used, and this is good.
@microsoft-github-policy-service agree |
/azp run |
Azure Pipelines successfully started running 1 pipeline(s). |
An assert(pio->type != UNKNOWN_FD) in fd_table_set() causes that case to fail early anyway.
The change is approved, thank you, but what is now preventing it from being merged? |
I am facing issues with ssh reliability even having tweaked the client and server keepalive options. As a workaround, I want to read a remote process ID before subsequent lines of output but I am facing buffering until the remote process has exited. I have a feeling this is a common requirement among devs who want POSIX pty-like line-buffering but get standard libc buffering when the output is a pipe. Will this functionality allow me to essentially setvbuf to unbuffer the ssh output I am receiving with C# Process API? |
Windows native OpenSSH has alternative behavior for standard I/O descriptors, which can be selected through the OPENSSH_STDIO_MODE environement variable. Setting it to "nonsock" is required for sshfs compatibility. See PowerShell/openssh-portable#759 for details.
Windows native OpenSSH has alternative behavior for standard I/O descriptors, which can be selected through the OPENSSH_STDIO_MODE environement variable. Setting it to "nonsock" is required for sshfs compatibility. See PowerShell/openssh-portable#759 for details. Subitted upstream here libfuse/sshfs#314
stdio descriptors (stdin, stdout and stderr) can be operated in various modes by win32compat code. The behavior is set very early in fd_table_initialize() by setting pio->type.
In PowerShell/Win32-OpenSSH#1427 it was chosen to set pio->type to NONSOCK_SYNC_FD to resolve an I/O hang problem. Unfortunately this introduce problems for other ssh usage.
sshfs-wiun uses ssh and has at leas 6 open issues for the same problem introduced by this NONSOCK_SYNC_FD change: https://github.com/winfsp/sshfs-win/issues?q=is%3Aissue+cb+%3A87
The sshfs-win workaround it to use an older ssh.exe from cygwin, which is bundled with sshfs-win. This program is unable to use ssh-agent, which is quite frustrating. And if PATH is not set to use it, sshfs-win cannot work.
This change introduce an OPENSSH_STDIO_MODE environment variable that can be set to the following values: unknown, sock, nonsock, nonsock_sync. It cause pio->type to be set to UNKNOWN_FD, SOCK_FD, NONSOCK_FD, and NONSOCK_SYNC_FD respecitively. The default behavior when the variable is not set is unchanged (which means NONSOCK_SYNC_FD).
Setting OPENSSH_STDIO_MODE="nonsock" lets sshfs-win work again with openssh-portable ssh.exe. ssh-agent can be used, and this is good.
PR Summary
PR Context