src/Pure/General/ssh.scala
changeset 64126 42bcd207598d
parent 64125 a034dac5ca3c
child 64127 14782d58a503
equal deleted inserted replaced
64125:a034dac5ca3c 64126:42bcd207598d
    13 
    13 
    14 object SSH
    14 object SSH
    15 {
    15 {
    16   /* init */
    16   /* init */
    17 
    17 
    18   def apply(config_dir: Path = Path.explode("~/.ssh"),
    18   def init(config_dir: Path = Path.explode("~/.ssh"),
    19     config_file: Path = Path.explode("~/.ssh/config"),
    19     config_file: Path = Path.explode("~/.ssh/config"),
    20     identity_files: List[Path] =
    20     identity_files: List[Path] =
    21       List("~/.ssh/id_dsa", "~/.ssh/id_ecdsa", "~/.ssh/id_rsa").map(Path.explode(_))): SSH =
    21       List("~/.ssh/id_dsa", "~/.ssh/id_ecdsa", "~/.ssh/id_rsa").map(Path.explode(_))): SSH =
    22   {
    22   {
    23     if (!config_dir.is_dir) error("Bad ssh config directory: " + config_dir)
    23     if (!config_dir.is_dir) error("Bad ssh config directory: " + config_dir)
    60   }
    60   }
    61 
    61 
    62 
    62 
    63   /* session */
    63   /* session */
    64 
    64 
    65   class Session private[SSH](val jsch: JSch, val session: JSch_Session)
    65   class Session private[SSH](val session: JSch_Session)
    66   {
    66   {
    67     override def toString: String =
    67     override def toString: String =
    68       (if (session.getUserName == null) "" else session.getUserName + "@") +
    68       (if (session.getUserName == null) "" else session.getUserName + "@") +
    69       (if (session.getHost == null) "" else session.getHost) +
    69       (if (session.getHost == null) "" else session.getHost) +
    70       (if (session.getPort == 22) "" else ":" + session.getPort)
    70       (if (session.getPort == 22) "" else ":" + session.getPort) +
       
    71       (if (session.isConnected) "" else " (disconnected)")
    71 
    72 
    72     def open: Session = { session.connect; this }
    73     def close { session.disconnect }
    73     def close: Session = { session.disconnect; this }
       
    74 
    74 
    75     def channel_exec: ChannelExec =
    75     def channel_exec: ChannelExec =
    76       session.openChannel("exec").asInstanceOf[ChannelExec]
    76       session.openChannel("exec").asInstanceOf[ChannelExec]
    77 
    77 
    78     def channel_sftp: ChannelSftp =
    78     def channel_sftp: ChannelSftp =
    90   }
    90   }
    91 }
    91 }
    92 
    92 
    93 class SSH private(val jsch: JSch)
    93 class SSH private(val jsch: JSch)
    94 {
    94 {
    95   def session(host: String, port: Int = 22, user: String = null,
    95   def open_session(host: String, port: Int = 22, user: String = null,
    96       compression: Boolean = true): SSH.Session =
    96     compression: Boolean = true): SSH.Session =
    97   {
    97   {
    98     val session = jsch.getSession(user, host, port)
    98     val session = jsch.getSession(user, host, port)
    99 
    99 
   100     session.setUserInfo(SSH.No_User_Info)
   100     session.setUserInfo(SSH.No_User_Info)
   101     session.setConfig("MaxAuthTries", "3")
   101     session.setConfig("MaxAuthTries", "3")
   104       session.setConfig("compression.s2c", "zlib@openssh.com,zlib,none")
   104       session.setConfig("compression.s2c", "zlib@openssh.com,zlib,none")
   105       session.setConfig("compression.c2s", "zlib@openssh.com,zlib,none")
   105       session.setConfig("compression.c2s", "zlib@openssh.com,zlib,none")
   106       session.setConfig("compression_level", "9")
   106       session.setConfig("compression_level", "9")
   107     }
   107     }
   108 
   108 
   109     new SSH.Session(jsch, session)
   109     session.connect
       
   110     new SSH.Session(session)
   110   }
   111   }
   111 }
   112 }