【问题标题】:Remote execution of SSH command hangs in ruby using Net::SSH for a particular command对特定命令使用 Net::SSH 远程执行 SSH 命令在 ruby​​ 中挂起
【发布时间】:2022-06-06 23:46:00
【问题描述】:

我发现了一个类似的问题here,但是这样一个问题的答案对我不起作用。

我正在尝试使用 Net::SSH 通过 ruby​​ 连接远程 ssh 服务器。

通过脚本提供的所有命令对我来说都很好,我可以成功读取命令的输出。

但是当我使用下面的命令时,它会卡在 SSH.exec!(cmd) 中,并且不会从该行返回控制。只有当我在命令行中单击 Ctrl+c 时,脚本才会结束。

sudo -S su root -c 'cockroach start --advertise-addr=34.207.235.139:26257 --certs-dir=/home/ubuntu/certs --store=node0015 --listen-addr=172.31.17.244:26257 --http-addr=172.31.17.244:8080 --join=34.207.235.139:26257 --background --max-sql-memory=.25 --cache=.25;'

这是我从 SSH 终端运行的脚本,没有问题:

sudo -S su root -c 'pkill cockroach'
sudo -S su root -c '
cd ~;
mv /home/ubuntu/certs /home/ubuntu/certs.back.back;
mkdir /home/ubuntu/certs;
mkdir -p /home/ubuntu/my-safe-directory;
cockroach cert create-ca --allow-ca-key-reuse --certs-dir=/home/ubuntu/certs --ca-key=/home/ubuntu/my-safe-directory/ca.key;
cockroach cert create-node localhost 34.207.235.139 172.31.17.244 $(hostname) --certs-dir /home/ubuntu/certs --ca-key /home/ubuntu/my-safe-directory/ca.key;
cockroach cert create-client root --certs-dir=/home/ubuntu/certs --ca-key=/home/ubuntu/my-safe-directory/ca.key;
        '
sudo -S su root -c 'cockroach start --advertise-addr=34.207.235.139:26257 --certs-dir=/home/ubuntu/certs --store=node0015 --listen-addr=172.31.17.244:26257 --http-addr=172.31.17.244:8080 --join=34.207.235.139:26257 --background --max-sql-memory=.25 --cache=.25;'

这是尝试完全一样的 Ruby 脚本,但它卡住了:

require 'net/ssh'

ssh = Net::SSH.start('34.207.235.139', 'ubuntu', :keys => './plank.pem', :port => 22)

s = "sudo -S su root -c 'pkill cockroach'"
print "#{s}... "
puts ssh.exec!(s)

s = "sudo -S su root -c '
cd ~;
mv /home/ubuntu/certs /home/ubuntu/certs.back.#{rand(1000000)}};
mkdir /home/ubuntu/certs;
mkdir -p /home/ubuntu/my-safe-directory;
cockroach cert create-ca --allow-ca-key-reuse --certs-dir=/home/ubuntu/certs --ca-key=/home/ubuntu/my-safe-directory/ca.key;
cockroach cert create-node localhost 34.207.235.139 172.31.17.244 $(hostname) --certs-dir /home/ubuntu/certs --ca-key /home/ubuntu/my-safe-directory/ca.key;
cockroach cert create-client root --certs-dir=/home/ubuntu/certs --ca-key=/home/ubuntu/my-safe-directory/ca.key;
        '"
print "Installing SSL certifications... "
puts "done (#{ssh.exec!(s)})"

s = "sudo -S su root -c 'cockroach start --advertise-addr=34.207.235.139:26257 --certs-dir=/home/ubuntu/certs --store=node0015 --listen-addr=172.31.17.244:26257 --http-addr=172.31.17.244:8080 --join=34.207.235.139:26257 --background --max-sql-memory=.25 --cache=.25;'"
print "Running start command... "
puts "done (#{ssh.exec!(s)})"

# Use this command to verify the node is running:
# ps ax | grep cockroach | grep -v grep
s = "ps ax | grep cockroach | grep -v grep"
print "#{s}... "
sleep(10)
puts "done (#{ssh.exec!(s)})"

ssh.close

exit(0)

这是 ruby​​ 脚本的 put put:

C:\code2\blackstack-deployer\examples>ruby start-crdb-environment.rb
sudo -S su root -c 'pkill cockroach'...
Installing SSL certifications... done ()
Running start command...

如您所见,该命令卡在Running start command... 行中

我尝试将命令放在后台:

s = "sudo -S su root -c 'cockroach start --advertise-addr=34.207.235.139:26257 --certs-dir=/home/ubuntu/certs --store=node0015 --listen-addr=172.31.17.244:26257 --http-addr=172.31.17.244:8080 --join=34.207.235.139:26257 --background --max-sql-memory=.25 --cache=.25 &'"
print "Running start command... "
puts "done (#{ssh.exec!(s)})"

但发生的事情是蟑螂进程从不启动(ps ax | grep cockroach | grep -v grep 不返回任何内容)

【问题讨论】:

    标签: ruby cockroachdb net-ssh


    【解决方案1】:

    我想出了如何解决它。

    我在命令末尾添加了> /dev/null 2>&1,它起作用了。

    cockroach start --background --max-sql-memory=.25 --cache=.25 --advertise-addr=%net_remote_ip%:%crdb_database_port% --certs-dir=%crdb_database_certs_path%/certs --store=%name% --listen-addr=%eth0_ip%:%crdb_database_port% --http-addr=%eth0_ip%:%crdb_dashboard_port% --join=%net_remote_ip%:%crdb_database_port% > /dev/null 2>&1;
    

    【讨论】:

      【解决方案2】:

      cockroach-data/logs 目录中是否有任何日志/输出(应该位于运行 start 命令的位置)。

      或者也许尝试将 stdout+stderr 重定向到一个文件并查看那里是否有任何输出。

      我的假设是 CRDB 进程没有正确启动,因此没有将控制权返回给终端。 cockroachdb docs 表示 --background 标志仅在 crdb 进程准备好接受连接时返回控制。您链接的问题/答案指出“SSH.exec!将阻止进一步执行,直到命令返回”。

      【讨论】:

      • 刚刚看到你找到了解决方案,太棒了:)
      猜你喜欢
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 2020-12-04
      • 2010-12-25
      • 1970-01-01
      • 2017-08-13
      相关资源
      最近更新 更多