siguiente escenario:
Ahora quiero escribir una aplicación C# .NET 6 que pueda cambiar la contraseña del usuario. En Linux simplemente llamaría
sudo passwd username Mi primera idea fue crear un nuevo proceso, redirigir el stdin y escribir la contraseña allí.
Otra opción sería crear un script bash y llamarlo desde C# (también usando un nuevo proceso).
Sin embargo, ambos me parecen un poco raros. ¿Hay alguna opción para cambiar la contraseña en proceso en C#?
Algo en este sentido debería funcionar correctamente si ya tiene el script de shell de Linux.
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)){ var ShellScriptPath = $"-c '{ShellScriptPath } &>> {OutputTextFilePath}'"; var fileInfo = new FileInfo(ShellScriptPath); var startInfo = new ProcessStartInfo { CreateNoWindow = true, RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, FileName = "/bin/bash", WindowStyle = ProcessWindowStyle.Hidden, Arguments = fileInfo.FullName, WorkingDirectory = WorkingDirectoryPath, }; using Process process = Process.Start(startInfo); process.WaitForExit(); process.Dispose(); }Programa.cs
class PasswordChanger { static void Main(string[] args) { string password = args[1]; string user = args[0]; Console.WriteLine(ShellHelper.Bash($"echo -e \"{password}\n{password}\n\" | sudo passwd {user}")); } }LinuxHelper.cs
using System; using System.Diagnostics; namespace LinuxHelper { public static class ShellHelper { public static string Bash(string cmd) { string escapedArgs = cmd.Replace("\"", "\\\""); Process process = new Process() { StartInfo = new ProcessStartInfo { FileName = "/bin/bash", Arguments = $"-c \"{escapedArgs}\"", RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true, } }; process.Start(); string result = process.StandardOutput.ReadToEnd(); process.WaitForExit(); return result; } } }El código anterior funciona, toma dos argumentos: el primero es el nombre de usuario, el segundo es la contraseña. He separado la solución en dos archivos porque LinuxHelper/Shellhelper se puede usar para cualquier comando de shell al que necesite llamar. La función/método principal también se puede modificar fácilmente para que sea un método estándar en cualquier proyecto. Si cambia el método Main para que sea un método dentro de una clase, le sugiero que cambie (string[] args) a (string user, string password), luego puede eliminar las declaraciones de cadena dentro del método.