Passwort nutzen: Auto-Login via sshpass + Keychain, Editor mit Anzeige/Loeschen, Doku

This commit is contained in:
x3
2026-09-21 23:21:07 +02:00
parent 7dc6ff75d2
commit 4fd711474c
7 changed files with 113 additions and 11 deletions
+20 -2
View File
@@ -20,9 +20,11 @@ enum PTYState: Equatable {
final class PTYSession: ObservableObject {
@Published private(set) var lines: [[StyledText]] = [[]]
@Published private(set) var state: PTYState = .never
@Published private(set) var autoLogin = false
var executable = ""
var arguments: [String] = []
var customEnv: [String: String] = [:]
private var masterFD: Int32 = -1
private var process: Process?
@@ -48,6 +50,10 @@ final class PTYSession: ObservableObject {
self.arguments = arguments
}
func setAutoLogin(_ value: Bool) {
autoLogin = value
}
func start() {
cleanupSync()
epoch += 1
@@ -79,6 +85,7 @@ final class PTYSession: ObservableObject {
var env = ProcessInfo.processInfo.environment
env["TERM"] = "xterm-256color"
if env["LANG"] == nil { env["LANG"] = "de_DE.UTF-8" }
for (k, v) in customEnv { env[k] = v }
p.environment = env
// closeOnDealloc=false: Parent schließt slave explizit nach run().
p.standardInput = FileHandle(fileDescriptor: slave)
@@ -282,11 +289,22 @@ final class TerminalManager: ObservableObject {
func session(for profile: ConnectionProfile, key: StoredSSHKey?) -> PTYSession {
if let existing = sessions[profile.id] { return existing }
let s = PTYSession()
let baseExe: String
let baseArgs: [String]
if profile.proto == .sftp {
s.configure(executable: "/usr/bin/sftp", arguments: ["-P", "\(profile.port)"] + (key.map { ["-i", $0.privateKeyPath] } ?? []) + ["\(profile.username)@\(profile.host)"])
baseExe = "/usr/bin/sftp"
baseArgs = ["-P", "\(profile.port)"] + (key.map { ["-i", $0.privateKeyPath] } ?? []) + ["\(profile.username)@\(profile.host)"]
} else {
s.configure(executable: "/usr/bin/ssh", arguments: SSHService.sshArguments(for: profile, key: key))
baseExe = "/usr/bin/ssh"
baseArgs = SSHService.sshArguments(for: profile, key: key)
}
// Auto-Login nur mit Keychain-Secret + sshpass, sonst interaktiver Prompt im Terminal
let cfg = SSHService.sessionConfig(executable: baseExe, args: baseArgs,
password: SSHService.loginSecret(for: profile, key: key),
sshpassPath: SSHService.findSshpass())
s.configure(executable: cfg.executable, arguments: cfg.arguments)
s.customEnv = cfg.extraEnv
s.setAutoLogin(cfg.autoLogin)
sessions[profile.id] = s
return s
}