Comments (5)
Hi! I've seen this issue in production, and it kills my app permanently when it hangs. Would you be open for a PR fixing this? Are there any specific issues that makes it hard? Thanks! :)
from clj-ssh.
Not sure how to reproduce this issue, but I had a similar problem. All of the worker threads in my app were tied up in the with-connection
call, rendering my app useless until restart.
Here's a potential workaround, in case it benefits anyone.
I noticed in the source that the Session protocol has a two-arity connect
that includes a timeout parameter.
Line 119 in c50b842
It seems to work, but is not being used by thewith-connection
macro.
We can just define our own alternative macro that uses the timeout parameter:
;; "ssh" here is an alias for clj-ssh.ssh, make sure you are requiring that in your ns declaration
(defmacro with-connection-timeout
"Creates a context in which the session is connected. Ensures the session is
disconnected on exit. Will timeout after the provided number of milliseconds if not succesfully connected."
[session timeout & body]
`(let [session# ~session timeout# ~timeout]
(try
(when-not (ssh/connected? session#)
(ssh/connect session# timeout#))
~@body
(finally
(ssh/disconnect session#)))))
You can test this by trying to connect to a non-sftp host:
(let [agent (ssh/ssh-agent {})
sess (ssh/session agent "google.com" {})]
(with-connection-timeout sess 5000
"something!"))
After 5 seconds, it will throw an exception: com.jcraft.jsch.JSchException
with message "timeout: socket is not established"
However, do note that this timeout param only controls the time to connect to the socket.
If you do some long-running work inside the body, the timeout param will not prevent that.
For example, if this code connects successfully within 3 seconds, it will then execute the 9 second thread sleep before closing the connection and returning:
(with-connection-timeout sess 3000
(Thread/sleep 9000)
"this took at least 9 seconds to return")
from clj-ssh.
If you check how the Util.createSocket is implemented, you will see that the timeout defines an upper limit of the connection only, not a lower limit, because the timeout is strangely not passed to an underlying Socket.Those 20 seconds is probably an OS-level default limit.To override it, try implementing the SocketFactory and attach it to the session using the Session.setSocketFactory.
链接 stackoverflow
please close
from clj-ssh.
no timeout and hanging still present in 2019-05
from clj-ssh.
Nice work @brianfay. Thank you
from clj-ssh.
Related Issues (20)
- Out-stream doesn't seem to work? HOT 1
- add a nice wrapper for the direct-tcpip channel type HOT 1
- interactive mode fom repl?
- Unable to disable public key authentication.
- No matching method found: put for class com.jcraft.jsch.ChannelSftp HOT 1
- Compile Error in Clojure 1.8
- shell-session echos what I send?
- How do I incorporate extra SSH options in my ssh commands HOT 2
- ssh-agent causing HOT 1
- Packet corrupt on connection failure
- Using same session to modify enviroment
- Quiet mode
- ClassCastException com.jcraft.jsch.Session cannot be cast to java.lang.String clj-ssh.ssh/session-impl HOT 2
- Potential deadlock on hanging SocketInputStream.socketRead
- Add documentation for changing authentication type of session.
- scp-receive-command might fails with AIOOB HOT 1
- Corruption in files sent via SFTP put depending on SFTP server
- Consider pointing to jsch fork HOT 4
- Consider redact password included in jump-connect exception HOT 1
- ssh local port forwarding HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from clj-ssh.