- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在 golang 中使用 crypto/ssh 包编写了一个小型 SSH 服务器。
它支持返回交互式 shell 并立即执行命令。
这是服务器的一个最小示例:
package main
import (
"fmt"
"io/ioutil"
"log"
"net"
"os/exec"
"golang.org/x/crypto/ssh"
)
func main() {
c := &ssh.ServerConfig{
PasswordCallback: func(c ssh.ConnMetadata, pass []byte) (*ssh.Permissions, error) {
if c.User() == "foo" && string(pass) == "bar" {
return nil, nil
}
return nil, fmt.Errorf("password rejected for %q", c.User())
},
}
keyBytes, _ := ioutil.ReadFile("key")
key, _ := ssh.ParsePrivateKey(keyBytes)
c.AddHostKey(key)
listener, _ := net.Listen("tcp", "0.0.0.0:2200")
for {
tcpConn, _ := listener.Accept()
_, chans, reqs, _ := ssh.NewServerConn(tcpConn, c)
go ssh.DiscardRequests(reqs)
go handleChannels(chans)
}
}
func handleChannels(chans <-chan ssh.NewChannel) {
for newChannel := range chans {
go handleChannel(newChannel)
}
}
func handleChannel(newChannel ssh.NewChannel) {
channel, requests, _ := newChannel.Accept()
for req := range requests {
switch req.Type {
case "shell":
go handleShell(channel)
case "exec":
go handleExec(channel, req)
}
}
}
func handleShell(c ssh.Channel) {}
func handleExec(c ssh.Channel, r *ssh.Request) {
cmdString, args, _ := parseCommand(r.Payload)
log.Printf("exec: %s\n", cmdString)
for i := range args {
log.Printf("arg %d: %s\n", i, args[i])
}
cmd := exec.Command(cmdString, args...)
cmd.Run()
}
func parseCommand(b []byte) (string, []string, error) {
cmdString := strings.TrimSpace(string(b))
cmdArray := strings.Split(cmdString, " ")
cmd := strings.Trim(cmdArray[0], " ")
args := cmdArray[1:]
return cmd, args, nil
}
如果我运行服务器,执行scp如下:
scp -P 2200 test.file foo@localhost:~/
handleExec 函数被调用。
cmdString 的输出显示:
2015/11/22 17:49:14 exec: scp
2015/11/22 17:49:14 arg 0: -t
2015/11/22 17:49:14 arg 1: ~/
但是我如何实现 handleExec 函数来实际保存我通过 scp 传递的文件/目录?
最佳答案
我刚刚遇到了在我的 ssh 服务器上执行 scp 和自定义命令的问题,由于没有记录如何执行此操作,我从 crypto.ssh(https://github.com/golang/crypto/blob/master/ssh/session.go 和 https://github.com/golang/crypto/blob/master/ssh/session_test.go)中的测试中拼凑了一些代码它与 OpenSSH 和 crypto.ssh 客户端一起工作。例如,您可以在客户端调用 session.Run() 并处理例如scp 或自定义命令。
type exitStatusMsg struct {
Status uint32
}
// RFC 4254 Section 6.5.
type execMsg struct {
Command string
}
go func(in <-chan *ssh.Request, channel ssh.Channel) {
for req := range in {
if req.Type == "exec" {
var msg execMsg
if err := ssh.Unmarshal(req.Payload, &msg); err != nil {
log.Printf("error parsing ssh execMsg: %s\n", err)
req.Reply(false, nil)
return
}
go func(msg execMsg, ch ssh.Channel) {
// ch can be used as a ReadWriteCloser if there should be interactivity
runYourCommand(msg.Command, ch)
ex := exitStatusMsg{
Status: 0,
}
// return the status code
if _, err := ch.SendRequest("exit-status", false, ssh.Marshal(&ex)); err != nil {
log.Printf("unable to send status: %v", err)
}
ch.Close()
}(msg, channel)
req.Reply(true, nil) // tell the other end that we can run the request
} else {
req.Reply(req.Type == "shell", nil)
}
}
}(requests, channel)
您需要用任何函数替换 runYourCommand 然后执行您的命令并将退出代码设置为您的命令/进程返回的任何内容。
关于ssh - Golang SSH 服务器 : How to handle file transfer with scp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33846959/
我想知道使用 SCP 传输文件时使用的默认模式是什么(ASCII 或二进制,如 FTP)。 SCP 中是否有任何文件模式概念?它是如何工作的 ? 最佳答案 FTP中的文件传输方式用于解决不同操作系统行
我想知道是否有一种方法可以让我通过remote1主机直接从本地计算机对remote2主机的文件进行SCP。 网络仅允许从远程 1 主机连接到远程 2 主机。另外,remote1 主机和remote2
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 6 年前。 此问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-topic在这里
我正在寻找一个多平台解决方案,可以让我检查 scp命令可用。 问题是 scp 没有 --version命令行,当不带参数调用时,它将返回退出代码 1 (错误)。 更新:如果不清楚,多平台我的意思是一个
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
我在 Windows A 上运行 freeSSHD,需要通过 scp 传输文件。运行 freesshd 的 Windows 可以通过 ssh 客户端连接。但是 Windows 上的 WinSCP 和
我正在我的 Windows 机器上使用腻子通过 ssh 访问 ubuntu 服务器,并尝试将单个文件下载到我的本地 Windows 机器 我的 Windows 用户名是 Mark,每个 cmd 的主机
所以我发现我可以通过标准输入对 scp 执行以下操作: 目录创建 scp -tr . stdin -> D0755 0 stdin -> \x00 文件写入 scp -tr . stdin -> C
请为我在工作中面临的问题提供您的专家选项。 Ant SCP 任务不起作用 - 因为我可以使用 cygwin 进行 scp。 本地环境:windows 7 64 位、Jdk 1.6.0.24、Ant-1
我需要重新安装我们的一台服务器,作为预防措施,我想移动 /home、/etc、/opt和 /Services 到备份服务器。 但是,我有一个问题:由于存在大量符号链接(symbolic link),因
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我有一个小型应用程序,它试图执行十几个并行“scp”运行,从远程系统中提取文件。通常,它运行良好。有时,一两个 scp 悄悄地死掉了。(如果从 Linux 中拉出,则为“安静”。如果从 HP-UX 中
我有一个脚本可以将文件从一台服务器传输到另一台服务器,但它给出了一个错误: Net::SCP::Error (SCP did not finish successfully ()): 有谁能够帮助我?
下面是我的 shell 脚本片段,我在其中执行 scp 命令将文件从 machineB 复制到 machineA。 for element in ${x[$key]}; do # no quote
我有一个适用于不同客户端的脚本,需要将 SCP 文件发送到不同的主机。根据客户端和服务器的组合,我可能需要使用密码身份验证或公钥身份验证。我真的无法提前知道使用哪一个。 我使用的 SCP 有 2 个
我正在尝试使用 libssh2 scp 从实例中检索文件。 为了确保我的用户名、密码和 key 正确无误,我做了: sudo scp -v -P #port -i /home/username/.ss
我正在尝试使用 scp 在两台 Mac (OS 10.6.8) 之间传输文件。但它失败了,因为我的目录/文件名中有空格。我无法更改目录/文件名。 在我的 Mac 的终端中工作时,我经常使用\符号来表示
我需要一些帮助来在 xml 中构建这一行。对于谷歌内容 API 我想要得到的结果是 25 目前我的代码输出这一行 25这是不正确的。 这是我的代码 b = Nokogiri::XML::Builder
我正在使用命令: docker-machine scp 管理器:/home/docker/foo.txt 。 但是,Windows PowerShell 返回“您必须在本地拥有 scp 二进制文件的副
我们知道 String将被存储在SCP(字符串常量池)区域: 1.以同样的方式String[]也存储在SCP中?我的意思是每个数组包含一个 String ,那么这又会被存储在 SCP 中吗? 2.那么
我是一名优秀的程序员,十分优秀!