【发布时间】:2021-12-29 16:43:24
【问题描述】:
我需要在运行 ROS 的远程机器上自动化一些启动过程。为此,我尝试使用 paramiko 通过 ssh 登录远程机器并启动启动文件。
我遇到的问题是我的 ~/.bashrc 文件没有来源。
我可以获取源 /opt/ros/noetic/setup.bash 并让 roscore 工作,但我找不到任何启动文件,因为我的工作空间没有源:
command = 'source /opt/ros/noetic/setup.bash && roscore'
我的 bashrc 文件同时包含 source /opt/ros/noetic/setup.bash 和源代码 source /home/ben/catkin_ws/devel/setup.bash 但每当我像以前一样获取此文件时,我什至无法让 roscore 工作 -
command = 'source ~/.bashrc && roscore'
Connected to 192.168.XX.XX
bash: roscore: command not found
一个最小的工作示例 -
#! /usr/bin/env python3
import paramiko
import numpy as np
import os
class Paramiko():
def __init__(self, hostname, username, password, port):
self.hostname = hostname
self.username = username
self.password = password
self.port = port
paramiko.util.log_to_file("paramiko.log")
def ExecuteCommand(self, command):
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(self.hostname, username = self.username, password = self.password)
print("Connected to %s" % self.hostname)
except paramiko.AuthenticationException:
print("Failed to connect to %s due to wrong username/password" %self.hostname)
exit(1)
except Exception as e:
print(e.message)
exit(2)
try:
stdin, stdout, stderr = ssh.exec_command(command)
except Exception as e:
print(e.message)
err = ''.join(stderr.readlines())
out = ''.join(stdout.readlines())
final_output = str(out)+str(err)
print(final_output)
return final_output
def main():
hostname = "192.168.XX.XX"
username = "ben"
password = "lol_nice_try"
port = 22
command = 'source ~/.bashrc && roslaunch some_package some_launchfile.launch'
para = Paramiko(hostname, username, password, port)
answer = para.ExecuteCommand(command)
if __name__ == "__main__":
main()
我正在考虑使用 bash 脚本来执行此操作,或者可能使用 os.system 执行此操作,但这将是一个全新的开始,并且有它自己的问题。
对想法持开放态度。在做一些阅读时,我会相信 paramiko ssh 实际上不是登录会话?
我尝试在按照Problems with python interpertor after ssh with paramiko into a remote machine 调用 exec_command 时设置 try get_pty=true,但这没有任何作用。我什至不确定该选项实际上做了什么,因为 paramiko 文档似乎没有任何关于它的内容。
关于该线程的另一条评论说有一个专门的配置文件,但这不就是 ~/.bashrc 吗?
【问题讨论】: