mirror of
https://github.com/neon443/ShhShell.git
synced 2026-03-11 05:19:13 +00:00
try to write to channel
got automatic reading done
This commit is contained in:
@@ -13,6 +13,7 @@ import SwiftUI
|
|||||||
class SSHHandler: ObservableObject {
|
class SSHHandler: ObservableObject {
|
||||||
private var session: ssh_session?
|
private var session: ssh_session?
|
||||||
private var channel: ssh_channel?
|
private var channel: ssh_channel?
|
||||||
|
private var readTimer: Timer?
|
||||||
|
|
||||||
@Published var authorized: Bool = false
|
@Published var authorized: Bool = false
|
||||||
@Published var connected: Bool = false
|
@Published var connected: Bool = false
|
||||||
@@ -308,16 +309,31 @@ class SSHHandler: ObservableObject {
|
|||||||
status = ssh_channel_request_shell(channel)
|
status = ssh_channel_request_shell(channel)
|
||||||
guard status == SSH_OK else { return }
|
guard status == SSH_OK else { return }
|
||||||
|
|
||||||
while ssh_channel_is_open(channel) != 0 && ssh_channel_is_eof(channel) == 0 {
|
// while ssh_channel_is_open(channel) != 0 && ssh_channel_is_eof(channel) == 0 {
|
||||||
var buffer: [CChar] = Array(repeating: 0, count: 256)
|
// var buffer: [CChar] = Array(repeating: 0, count: 256)
|
||||||
let nbytes = ssh_channel_read_nonblocking(channel, &buffer, UInt32(buffer.count), 0)
|
// let nbytes = ssh_channel_read_nonblocking(channel, &buffer, UInt32(buffer.count), 0)
|
||||||
|
//
|
||||||
guard nbytes > 0 else { return }
|
// guard nbytes > 0 else { return }
|
||||||
write(1, buffer, Int(nbytes))
|
// write(1, buffer, Int(nbytes))
|
||||||
|
//
|
||||||
let data = Data(bytes: buffer, count: buffer.count)
|
// let data = Data(bytes: buffer, count: buffer.count)
|
||||||
print(String(data: data, encoding: .utf8)!)
|
// print(String(data: data, encoding: .utf8)!)
|
||||||
|
// }
|
||||||
|
|
||||||
|
readTimer = Timer(timeInterval: 0.1, repeats: true) { timer in
|
||||||
|
guard ssh_channel_is_open(self.channel) != 0 else {
|
||||||
|
timer.invalidate()
|
||||||
|
self.readTimer = nil
|
||||||
|
return
|
||||||
|
}
|
||||||
|
guard ssh_channel_is_eof(self.channel) == 0 else {
|
||||||
|
timer.invalidate()
|
||||||
|
self.readTimer = nil
|
||||||
|
return
|
||||||
|
}
|
||||||
|
self.readFromChannel()
|
||||||
}
|
}
|
||||||
|
RunLoop.main.add(readTimer!, forMode: .common)
|
||||||
}
|
}
|
||||||
|
|
||||||
func readFromChannel() {
|
func readFromChannel() {
|
||||||
@@ -337,4 +353,25 @@ class SSHHandler: ObservableObject {
|
|||||||
private func logSshGetError() {
|
private func logSshGetError() {
|
||||||
logger.critical("\(String(cString: ssh_get_error(&self.session)))")
|
logger.critical("\(String(cString: ssh_get_error(&self.session)))")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func writeToChannel() {
|
||||||
|
guard ssh_channel_is_open(channel) != 0 else { return }
|
||||||
|
guard ssh_channel_is_eof(channel) == 0 else { return }
|
||||||
|
|
||||||
|
var buffer: [CChar] = Array(repeating: 65, count: 256)
|
||||||
|
var nbytes: Int
|
||||||
|
var nwritten: Int
|
||||||
|
|
||||||
|
// readFromChannel()
|
||||||
|
nbytes = Int(read(0, &buffer, buffer.count))
|
||||||
|
nbytes = buffer.count
|
||||||
|
guard nbytes > 0 else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if nbytes > 0 {
|
||||||
|
nwritten = Int(ssh_channel_write(channel, &buffer, UInt32(nbytes)))
|
||||||
|
guard nwritten == nbytes else { return }
|
||||||
|
}
|
||||||
|
// readFromChannel()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,9 @@ struct TerminalView: View {
|
|||||||
@Environment(\.dismiss) var dismiss
|
@Environment(\.dismiss) var dismiss
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
|
Button("write") {
|
||||||
|
handler.writeToChannel()
|
||||||
|
}
|
||||||
TextViewController(text: $handler.terminal)
|
TextViewController(text: $handler.terminal)
|
||||||
.toolbar {
|
.toolbar {
|
||||||
ToolbarItem(placement: .cancellationAction) {
|
ToolbarItem(placement: .cancellationAction) {
|
||||||
|
|||||||
Reference in New Issue
Block a user