我在Python和Paramiko方面遇到了一些问题。我想连接到SSH服务器以自动从不同系统读取一些信息。
我尝试了一些我在这里找到的提示,但没有任何效果。我检查了hosts文件,使用brew重新安装Python,更新/升级Python和Paramiko,使用我的localhost上的ssh-server进行测试。还运行pip来更新paramiko和python。
我很困惑。请让我问你。
这是我的工作环境:
脚本:基本Paramiko SSH连接
package org.nctta.nctta_tournaments;
/**
* Created by John on 9/15/2017.
*/
import android.app.Activity;
import android.app.FragmentManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.content.Context;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import org.nctta.nctta_tournaments.fragments.TournamentFragment;
import java.util.ArrayList;
public class TournamentAdapter extends ArrayAdapter<Tournament> {
//create a new TournamentAdapter object.
public TournamentAdapter(Context context, ArrayList<Tournament> tournaments) {
super(context, 0 , tournaments);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//check if an existing view is being reuse, otherwise inflate the view
View listItemView = convertView;
if (listItemView ==null) {
listItemView = LayoutInflater.from(getContext()).inflate(
R.layout.tournament_list_item, parent, false);
}
//get the current tournament object at this position in the list
Tournament currentTournament = getItem(position);
//Find the TExtView in the tournament_list_item.xml layout with iD of name
TextView TourName = (TextView) listItemView.findViewById(R.id.Name);
//get/set the tournament name of the current tournament object
TourName.setText(currentTournament.getTournamentName());
//Find the TextView in the tournament_list_item.xml layout with ID of Location
TextView TourLocation = (TextView) listItemView.findViewById(R.id.Location);
//get/set the tournament location of the current tournament object;
TourLocation.setText(currentTournament.getTournamentLocation());
//Find the linearlayout with id of text_container
LinearLayout textArea = (LinearLayout) listItemView.findViewById(R.id.text_container);
textArea.setTag(currentTournament.getTournamentName());
//Find map view button with id of imageButton
ImageButton mapButton = (ImageButton) listItemView.findViewById(R.id.imageButton);
mapButton.setTag(currentTournament.getTournamentName());
final Context context = parent.getContext();
final FragmentManager fm = ((Activity) context).getFragmentManager();
//set onclicklisteners
textArea.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String str = v.getTag().toString();
Toast.makeText(getContext(),str + "TEXT", Toast.LENGTH_SHORT).show();
//start tournament fragment
fm.beginTransaction()
.replace(R.id.content_frame, new TournamentFragment())
.commit();
}
});
mapButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String str = v.getTag().toString();
Toast.makeText(getContext(),str + "MAP", Toast.LENGTH_SHORT).show();
}
});
return listItemView;
}
}
使用此输出在Eclipse上运行脚本:
'''
Created on 16.09.2017
'''
import sys
import telnetlib
import paramiko
host = '213.000.000.123' #
user = "user"
password = "password"
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, user, password)
好的,我发现了gai = getaddrinfo,还有getaddrbyname等等。所以我认为将主机字符串解析为IP地址存在问题。但是将IP地址解析为IP地址并没有意义。我使用了显式IP。 使用&#34; ssh 213.000.000.123&#34;命令直接在CLI上工作正常。
我也尝试连接到&#34; localhost&#34;或&#34; 127.0.0.1&#34;或&#34; google.com&#34;或其他。 hosts-file-entry未被注释,因此它处于活动状态。结果:情况相同。
NSLOOKUP工作正常,因此DNS查找工作正常,DNS服务器可用。
似乎Python可以在Eclipse中找到paramiko库,但是库中存在问题。
任何人都可以帮助我看看我的眼睛没有看到的东西。
非常感谢!
问候
答案 0 :(得分:3)
错误消息非常具有误导性。它实际上与DNS错误无关。
显然,paramiko使用的默认端口是22以外的端口。一旦我指定了端口,问题就会消失。
port = 22
k = paramiko.RSAKey.from_private_key_file(key_filename)
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
hostname = os.environ['DOCKER_EE_MANAGER_NODE']
username = os.environ['UCP_USER']
ssh.connect(hostname, port, username, pkey = k)
作品!享受!