mirror of
https://github.com/neon443/ShhShell.git
synced 2026-03-11 13:26:16 +00:00
fixed getAuthMethods - had to auth with none first
rename to testChannel in testexec to prevent confusion stop write(1 in testexec to prevent printing the output running testexec will disconnect after 3s, but keep result read non blocking in testexec added sshstate unused atm
This commit is contained in:
@@ -25,6 +25,7 @@
|
|||||||
A95FAA552DF4B62900DE2F5A /* LibSSH.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A95FAA502DF4B62100DE2F5A /* LibSSH.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
A95FAA552DF4B62900DE2F5A /* LibSSH.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A95FAA502DF4B62100DE2F5A /* LibSSH.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
A95FAA562DF4B62A00DE2F5A /* openssl.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A95FAA512DF4B62100DE2F5A /* openssl.xcframework */; };
|
A95FAA562DF4B62A00DE2F5A /* openssl.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A95FAA512DF4B62100DE2F5A /* openssl.xcframework */; };
|
||||||
A95FAA572DF4B62A00DE2F5A /* openssl.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A95FAA512DF4B62100DE2F5A /* openssl.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
A95FAA572DF4B62A00DE2F5A /* openssl.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A95FAA512DF4B62100DE2F5A /* openssl.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
|
A96C6A8A2E0C0B1100F377FE /* SSHState.swift in Sources */ = {isa = PBXBuildFile; fileRef = A96C6A892E0C0B1100F377FE /* SSHState.swift */; };
|
||||||
A98554552E05535F009051BD /* KeyManagerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98554542E05535F009051BD /* KeyManagerView.swift */; };
|
A98554552E05535F009051BD /* KeyManagerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98554542E05535F009051BD /* KeyManagerView.swift */; };
|
||||||
A98554592E0553AA009051BD /* KeyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98554582E0553AA009051BD /* KeyManager.swift */; };
|
A98554592E0553AA009051BD /* KeyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98554582E0553AA009051BD /* KeyManager.swift */; };
|
||||||
A985545D2E055D4D009051BD /* ConnectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A985545C2E055D4D009051BD /* ConnectionView.swift */; };
|
A985545D2E055D4D009051BD /* ConnectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A985545C2E055D4D009051BD /* ConnectionView.swift */; };
|
||||||
@@ -93,6 +94,7 @@
|
|||||||
A95FAA5A2DF4B79900DE2F5A /* ci_post_clone.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ci_post_clone.sh; sourceTree = "<group>"; };
|
A95FAA5A2DF4B79900DE2F5A /* ci_post_clone.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ci_post_clone.sh; sourceTree = "<group>"; };
|
||||||
A95FAA5B2DF4B7A000DE2F5A /* ci_pre_xcodebuild.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ci_pre_xcodebuild.sh; sourceTree = "<group>"; };
|
A95FAA5B2DF4B7A000DE2F5A /* ci_pre_xcodebuild.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ci_pre_xcodebuild.sh; sourceTree = "<group>"; };
|
||||||
A95FAA5C2DF4B7A300DE2F5A /* ci_prost_xcodebuild.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ci_prost_xcodebuild.sh; sourceTree = "<group>"; };
|
A95FAA5C2DF4B7A300DE2F5A /* ci_prost_xcodebuild.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ci_prost_xcodebuild.sh; sourceTree = "<group>"; };
|
||||||
|
A96C6A892E0C0B1100F377FE /* SSHState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SSHState.swift; sourceTree = "<group>"; };
|
||||||
A98554542E05535F009051BD /* KeyManagerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyManagerView.swift; sourceTree = "<group>"; };
|
A98554542E05535F009051BD /* KeyManagerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyManagerView.swift; sourceTree = "<group>"; };
|
||||||
A98554582E0553AA009051BD /* KeyManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyManager.swift; sourceTree = "<group>"; };
|
A98554582E0553AA009051BD /* KeyManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyManager.swift; sourceTree = "<group>"; };
|
||||||
A985545C2E055D4D009051BD /* ConnectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionView.swift; sourceTree = "<group>"; };
|
A985545C2E055D4D009051BD /* ConnectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionView.swift; sourceTree = "<group>"; };
|
||||||
@@ -225,6 +227,7 @@
|
|||||||
children = (
|
children = (
|
||||||
A9C897EE2DF1A9A400EF9A5F /* SSHHandler.swift */,
|
A9C897EE2DF1A9A400EF9A5F /* SSHHandler.swift */,
|
||||||
A9C4140B2E096DB7005E3047 /* SSHError.swift */,
|
A9C4140B2E096DB7005E3047 /* SSHError.swift */,
|
||||||
|
A96C6A892E0C0B1100F377FE /* SSHState.swift */,
|
||||||
);
|
);
|
||||||
path = SSH;
|
path = SSH;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -422,6 +425,7 @@
|
|||||||
A985545F2E056EDD009051BD /* KeychainLayer.swift in Sources */,
|
A985545F2E056EDD009051BD /* KeychainLayer.swift in Sources */,
|
||||||
A93143C62DF61FE300FCD5DB /* ViewModifiers.swift in Sources */,
|
A93143C62DF61FE300FCD5DB /* ViewModifiers.swift in Sources */,
|
||||||
A98554632E0587DF009051BD /* HostsView.swift in Sources */,
|
A98554632E0587DF009051BD /* HostsView.swift in Sources */,
|
||||||
|
A96C6A8A2E0C0B1100F377FE /* SSHState.swift in Sources */,
|
||||||
A92538C82DEE0742007E0A18 /* ContentView.swift in Sources */,
|
A92538C82DEE0742007E0A18 /* ContentView.swift in Sources */,
|
||||||
A93143C02DF61B3200FCD5DB /* Host.swift in Sources */,
|
A93143C02DF61B3200FCD5DB /* Host.swift in Sources */,
|
||||||
A9B15A9A2E0ABA0400F66E02 /* DialogView.swift in Sources */,
|
A9B15A9A2E0ABA0400F66E02 /* DialogView.swift in Sources */,
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ class SSHHandler: @unchecked Sendable, ObservableObject {
|
|||||||
|
|
||||||
func connect() throws(SSHError) {
|
func connect() throws(SSHError) {
|
||||||
defer {
|
defer {
|
||||||
|
try? authWithNone()
|
||||||
getAuthMethods()
|
getAuthMethods()
|
||||||
self.host.key = getHostkey()
|
self.host.key = getHostkey()
|
||||||
}
|
}
|
||||||
@@ -169,25 +170,25 @@ class SSHHandler: @unchecked Sendable, ObservableObject {
|
|||||||
var buffer: [CChar] = Array(repeating: 0, count: 256)
|
var buffer: [CChar] = Array(repeating: 0, count: 256)
|
||||||
var nbytes: CInt
|
var nbytes: CInt
|
||||||
|
|
||||||
let channel = ssh_channel_new(session)
|
let testChannel = ssh_channel_new(session)
|
||||||
guard channel != nil else {
|
guard testChannel != nil else {
|
||||||
withAnimation { testSuceeded = false }
|
withAnimation { testSuceeded = false }
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
status = ssh_channel_open_session(channel)
|
status = ssh_channel_open_session(testChannel)
|
||||||
guard status == SSH_OK else {
|
guard status == SSH_OK else {
|
||||||
ssh_channel_free(channel)
|
ssh_channel_free(testChannel)
|
||||||
logger.critical("session opening error")
|
logger.critical("session opening error")
|
||||||
logSshGetError()
|
logSshGetError()
|
||||||
withAnimation { testSuceeded = false }
|
withAnimation { testSuceeded = false }
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
status = ssh_channel_request_exec(channel, "uptime")
|
status = ssh_channel_request_exec(testChannel, "uptime")
|
||||||
guard status == SSH_OK else {
|
guard status == SSH_OK else {
|
||||||
ssh_channel_close(channel)
|
ssh_channel_close(testChannel)
|
||||||
ssh_channel_free(channel)
|
ssh_channel_free(testChannel)
|
||||||
logger.critical("session opening error")
|
logger.critical("session opening error")
|
||||||
logSshGetError()
|
logSshGetError()
|
||||||
withAnimation { testSuceeded = false }
|
withAnimation { testSuceeded = false }
|
||||||
@@ -195,36 +196,27 @@ class SSHHandler: @unchecked Sendable, ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
nbytes = ssh_channel_read(
|
nbytes = ssh_channel_read(
|
||||||
channel,
|
testChannel,
|
||||||
&buffer,
|
&buffer,
|
||||||
UInt32(buffer.count),
|
UInt32(buffer.count),
|
||||||
0
|
0
|
||||||
)
|
)
|
||||||
while nbytes > 0 {
|
while nbytes > 0 {
|
||||||
let written = write(1, buffer, Int(nbytes))
|
nbytes = ssh_channel_read_nonblocking(testChannel, &buffer, UInt32(buffer.count), 0)
|
||||||
guard written == Int(nbytes) else {
|
|
||||||
ssh_channel_close(channel)
|
|
||||||
ssh_channel_free(channel)
|
|
||||||
logger.critical("write error")
|
|
||||||
logSshGetError()
|
|
||||||
withAnimation { testSuceeded = false }
|
|
||||||
return
|
|
||||||
}
|
|
||||||
nbytes = ssh_channel_read(channel, &buffer, UInt32(buffer.count), 0)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if nbytes < 0 {
|
if nbytes < 0 {
|
||||||
ssh_channel_close(channel)
|
ssh_channel_close(testChannel)
|
||||||
ssh_channel_free(channel)
|
ssh_channel_free(testChannel)
|
||||||
logger.critical("didnt read?")
|
logger.critical("didnt read?")
|
||||||
logSshGetError()
|
logSshGetError()
|
||||||
withAnimation { testSuceeded = false }
|
withAnimation { testSuceeded = false }
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
ssh_channel_send_eof(channel)
|
ssh_channel_send_eof(testChannel)
|
||||||
ssh_channel_close(channel)
|
ssh_channel_close(testChannel)
|
||||||
ssh_channel_free(channel)
|
ssh_channel_free(testChannel)
|
||||||
print("testExec succeeded")
|
print("testExec succeeded")
|
||||||
withAnimation { testSuceeded = true }
|
withAnimation { testSuceeded = true }
|
||||||
return
|
return
|
||||||
@@ -339,7 +331,6 @@ class SSHHandler: @unchecked Sendable, ObservableObject {
|
|||||||
print(authMethod.0)
|
print(authMethod.0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
print(recievedMethod)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//MARK: shell
|
//MARK: shell
|
||||||
|
|||||||
17
ShhShell/SSH/SSHState.swift
Normal file
17
ShhShell/SSH/SSHState.swift
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
//
|
||||||
|
// SSHState.swift
|
||||||
|
// ShhShell
|
||||||
|
//
|
||||||
|
// Created by neon443 on 25/06/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
enum SSHState {
|
||||||
|
case idle
|
||||||
|
case connecting
|
||||||
|
case authorizing
|
||||||
|
case authorized
|
||||||
|
case shellOpen
|
||||||
|
// case unauthorized
|
||||||
|
}
|
||||||
@@ -98,7 +98,14 @@ struct ConnectionView: View {
|
|||||||
} else {
|
} else {
|
||||||
handler.go()
|
handler.go()
|
||||||
}
|
}
|
||||||
withAnimation { handler.testExec() }
|
handler.testExec()
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now()+3) {
|
||||||
|
Task {
|
||||||
|
let result = handler.testSuceeded
|
||||||
|
await handler.disconnect()
|
||||||
|
handler.testSuceeded = result
|
||||||
|
}
|
||||||
|
}
|
||||||
} label: {
|
} label: {
|
||||||
if let testResult = handler.testSuceeded {
|
if let testResult = handler.testSuceeded {
|
||||||
Image(systemName: testResult ? "checkmark.circle" : "xmark.circle")
|
Image(systemName: testResult ? "checkmark.circle" : "xmark.circle")
|
||||||
|
|||||||
Reference in New Issue
Block a user