| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 | namespace Renci.SshNet.IntegrationTests{    internal class RemoteSshd    {        private readonly IConnectionInfoFactory _connectionInfoFactory;        public RemoteSshd(IConnectionInfoFactory connectionInfoFactory)        {            _connectionInfoFactory = connectionInfoFactory;        }        public RemoteSshdConfig OpenConfig()        {            return new RemoteSshdConfig(this, _connectionInfoFactory);        }        public RemoteSshd Restart()        {            // Restart SSH daemon            using (var client = new SshClient(_connectionInfoFactory.Create()))            {                client.Connect();                // Kill all processes that start with 'sshd' and that run as root                var stopCommand = client.CreateCommand("sudo pkill -9 -U 0 sshd.pam");                var stopOutput = stopCommand.Execute();                if (stopCommand.ExitStatus != 0)                {                    throw new ApplicationException($"Stopping ssh service failed with exit code {stopCommand.ExitStatus}.\r\n{stopOutput}\r\n{stopCommand.Error}");                }                var resetFailedCommand = client.CreateCommand("sudo /usr/sbin/sshd.pam");                var resetFailedOutput = resetFailedCommand.Execute();                if (resetFailedCommand.ExitStatus != 0)                {                    throw new ApplicationException($"Reset failures for ssh service failed with exit code {resetFailedCommand.ExitStatus}.\r\n{resetFailedOutput}\r\n{resetFailedCommand.Error}");                }            }            // Socket fails on Linux, reporting inability early. This is the Linux behavior by design.            // https://github.com/dotnet/runtime/issues/47484#issuecomment-769239699            // At this point we have to wait until the ssh server in the container is available after reconfiguration.            if (Environment.OSVersion.Platform == PlatformID.Unix)            {                Thread.Sleep(300);            }            return this;        }    }}
 |