- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用 jcraft.jsch channel 在 ssh 上运行多个命令,我发现每当我使用一些复杂的命令(使用正则表达式或使用管道)时,该命令的输出都会有一个意外的“前缀”,该“前缀”由命令片段组合而成,或者整个命令碎片化为用多个空格分隔的小块,并与各处的“<”字符组合...
示例1:
#ls /opt/qb/data2/oscar/process-manager-helper/*/var/core-dump/{2089,2090,2091,2092,2093,2094,2095}.*
ger-helper/*/var/core-dump/{20
<2/oscar/process-manager-helper/*/var/core-dump/{208 9,2090,2091,2092,ls: cannot access /opt/qb/data2/oscar/process-manager-helper/*/var/core-dump/2090.*: No such file or directory
ls: cannot access /opt/qb/data2/oscar/process-manager-helper/*/var/core-dump/2092.*: No such file or directory
ls: cannot access /opt/qb/data2/oscar/process-manager-helper/*/var/core-dump/2094.*: No such file or directory
ls: cannot access /opt/data2/oscar/process-manager-helper/*/var/core-dump/2095.*: No such file or directory
/opt/qb/data2/oscar/process-manager-helper/0/var/core-dump/2089.20141126-195527.213-00000000-opt.dell.srvadmin.bin.idracadm7.idracadm7.core.gz
/opt/qb/data2/oscar/process-manager-helper/0/var/core-dump/2091.20141126-201557.530-00000000-opt.dell.srvadmin.bin.idracadm7.idracadm7.core.gz
/opt/qb/data2/oscar/process-manager-helper/0/var/core-dump/2093.20141126-202822.524-00000000-opt.dell.srvadmin.bin.idracadm7.idracadm7.core.gz
示例2:
#du -s --block-size=1 /opt/qb/data2/oscar/process-manager-helper/0/var/core-dump/2089.20141126-195527.213-00000000-opt.dell.srvadmin.bin.idracadm7.idracadm7.core.gz | awk { print $1; }
rvadmin.bin.idracad
<-195527.213-00000000-opt.dell.srvadmin.bin.idracadm 7.idracadwk
<ell.srvadmin.bin.idracadm7.idracadm7.core.gz | awk { print $1; }
86016
这是一个重现它的示例代码(至少在我的设置上):
public static void main(String[] args) throws Exception
{
JSch myConnection = new JSch();
myConnection.setKnownHosts("/dev/null");
Session mySession = myConnection.getSession("root", "my-host.my-lab.com", 2222);
mySession.setPassword("password123");
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
mySession.setConfig(config);
mySession.connect(15000);
Channel myChannel = mySession.openChannel("shell");
((ChannelShell) myChannel).setPtyType("exec");
InputStream fromServer = myChannel.getInputStream();
OutputStream toServer = myChannel.getOutputStream();
myChannel.connect();
String commandString = "du -s --block-size=1 /opt/base/dir/eventLog | awk '{ print $1; }'";
toServer.write((commandString + "\n").getBytes());
toServer.flush();
Thread.sleep(5000);
StringBuffer result = new StringBuffer();
while (true)
{
int avail = fromServer.available();
if (avail > 0)
{
while (avail > 0)
{
byte[] buf = new byte[avail];
int bytesRead = 0;
if ((bytesRead = fromServer.read(buf)) < 0)
{
throw new IOException("connection is probably closed (can't read " + avail + " from server) - return value is " + bytesRead);
}
for (int i = 0; i < bytesRead; i++)
{
if (buf[i] >= 127 || buf[i] < 9 || (buf[i] >= 14 && buf[i] <= 31) || buf[i] == 11 || buf[i] == 12 || buf[i] == 8)
{
continue;
}
result.append((char) buf[i]);
}
avail = fromServer.available();
}
if (result.toString().trim().endsWith("#"))
{
System.out.println(result);
break;
}
}
}
}
请指教
最佳答案
Channel myChannel = mySession.openChannel("shell");
((ChannelShell) myChannel).setPtyType("exec");
[...]
String commandString = "du ...";
toServer.write((commandString + "\n").getBytes());
您正在打开一个 shell channel ,该 channel 通常用于交互式 session 。然后,您将命令字符串写入 channel 的输入流,该输入流模拟输入命令的字符。这种运行命令的方式是可行的,但远程系统的行为就像是交互式终端 session 一样。特别是,远程 shell 可能会打印命令提示符,而远程 PTY 可能会回显您的程序正在“键入”的文本。我认为这就是您所发生的情况 - 您正在运行的命令的输出与命令提示符和字符回显混合在一起。
您应该考虑使用 ChannelExec
运行远程命令而不是 ChannelShell
。使用 ChannelExec,远程系统可以直接调用您的命令(而不是调用 shell 并让您将命令提供给 shell 的输入)。当命令退出时 channel 将关闭,并且您不应该被字符回显或命令提示所困扰。
Jsch 有一个ChannelExec example 。您的代码将如下所示:
ChannelExec chan = mySession.openChannel("exec");
chan.setCommand("du ... | awk ...");
// Set input and output streams
// Request a PTY if you think you need one
chan.connect();
chan.connect()
将打开 channel 并在远程系统上启动命令。远程命令的标准输出可以从getInputStream()
返回的输入流中读取,命令的标准错误可以从getErrStream()
返回的流中读取。或者你可以用这些流做其他事情;请参阅示例。
关于java - ssh 与 jsch : non 'simple' command output trailed with unexpected output combined from fragments of the command in use,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27168654/
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
我错误地设置了 ssh key 的密码。 但是每次使用 key 时都要输入密码很烦人。 我想删除我的 key 的密码: $ ssh-keygen -p -f 但是,我担心 key 会被更改。 由于我
你好!我在连接到远程主机时遇到问题。我忘记了 ssh 密码,但我有 SSH key 的指纹。是否可以仅使用指纹进行连接? 最佳答案 不会。机器的指纹仅用于验证您正在连接您认为正在连接的机器。它是用于避
我有一个 Ubuntu 服务器 example.com 并且我已经通过 ssh 进入了它。但只有在我通过 ssh 进入它之后,我才意识到我打算执行 ssh -L 8000:localhost:9000
通过终端,我可以多次 SSH 连接到服务器: (客户端--->网关--->服务器1---->服务器2---) 但是现在要通过Java的JSch库来实现,怎么办呢?首先尝试了端口转发,但在终端上我没有这
在创建一个新的仓库(本地 + 远程)之后,我正在尝试推送提交。但是我遇到了 SSH key 的问题 在我的 ~/.ssh/config 中,我有一个 gitlab 条目定义为 Host MyRepoJ
我发现 ssh 和 ssh-keygen 有一种奇怪的行为:它们根本没有反应。 Cygwin 以管理员权限启动并正常运行。主机 192.168.1.1 已启动,我可以远程桌面到它: 当我尝试时: $
为什么eval语句返回 Illegal variable name $ eval "$(ssh-agent -s)" Illegal variable name. 最佳答案 请尝试$ eval "ss
我正在尝试通过以下命令从我的本地主机连接到远程主机。但是远程主机中有一个设置,我们登录后不久它会提示输入徽章 ID、密码和登录原因,因为它在 profile 中是这样编码的文件在 remote-hos
有时,我被迫在不稳定的互联网连接上使用 ssh。 ping some.doma.in PING some.doma.in (x.x.x.x): 56 data bytes Request timeou
This thread is a response to the titled question : Why ssh-agent doesn't forward my SSH certificate
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
因此,我在10.10.10.x子网中有一堆机器,基本上所有这些机器都以相同的方式配置。我将这些与我的10.10.11.x子网中的计算机区分开,后者具有不同的用途。 我希望能够输入“ssh 10.x”以
我不想在 vagrant box 上创建新的 SSH key 对,而是想重新使用主机上的 key 对,使用 agent forwarding 。我尝试过设置 config.ssh.forward_ag
我有一台服务器,可以通过ssh通过pubkey身份验证通过ssh访问: ssh "Host" -l "my identity" 这很好。但是,我无法在一个命令中使用我的私钥进行端口重定向和标识(这是我
创建一对 key 并通过 ssh-copy-id 将公钥发送到服务器后,我仍然无法在没有密码的情况下登录 ssh -v user@host 的输出 debug1:在/home/pumba/.ssh/k
我被困在 Permission denied (publickey) hell 中,试图将公钥复制到远程服务器,以便 Jenkins 可以在构建期间同步文件。 运行: sudo ssh-copy-id
我正在尝试通过我大学的代理服务器ssh到我们实验室的服务器之一。我们的目标是使用paramiko使其自动化,但我试图首先了解终端机级别中正在发生的事情。 我试过了 ssh -o ProxyComman
我在说明问题上有问题,我想通过SSH切换到我的Cisco交换机,但是我遇到了一些麻烦 我写了两个脚本, 有了这个我没有任何问题,我可以通过运行脚本并输入用户名和密码来更改默认网关: from Exsc
每个人 我目前正在使用一个集群,并且会经常使用“ssh”连接到它。有时我需要打开多个终端。因此,每次需要连接时,我都必须输入“ssh username@cluster.com”,然后输入“密码”(我在
我是一名优秀的程序员,十分优秀!